Cutting Sticks UVA - 10003(DP 仍有不明白的地方)
题意:对一根长为l的木棒进行切割,给出n个切割点,每次切割的价值,等于需要切割的木头长度。
一开始理解错了,认为切割点时根据当前木条的左端点往右推算。
实际上,左端点始终是不变的一直是0,右端点一直是l,切割点就是在0 ~ l 之间的点,而切割时的价值就是切割这个点的时候当前木条的长度。
状态转移方程:dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + 1][j] + cut[j] - cut[i]);
思路就是朝着子区间最优的情况靠拢,然后再求全局最优,由于子结构是包含在父结构中,所以用递归写的代码比较简单易懂。
博主 也参考了网上的代码,也有用数组的写法,但是数组写法博主也有还没弄懂的地方。
递归代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<iostream>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
const int inf = 0x3f3f3f3f;
int l,n;
int cut[];
int dp[][]; int DFS(int i, int j){
if(i - j <= ) return ;// 如果不需要切割,那么需要的价值就是0
if(dp[i][j] < inf) return dp[i][j];// 情况不能再分,则返回dp[i][j]的值
for(int k = i + ; k < j ; k++)
dp[i][j] = min(dp[i][j],DFS(i,k) + DFS(k,j) + cut[j] - cut[i]);// 对于每一个子情况用DFS进行搜索,来获取最优情况。
return dp[i][j];// 这里的dp[i][j] 就是最优解了
}
int main(){
while(~scanf("%d",&l) && l != ){
memset(dp,inf,sizeof(dp));
scanf("%d",&n);
for(int i = ; i <= n ; i++){
scanf("%d",&cut[i]);
}
cut[] = ;
cut[n + ] = l;
int ans = DFS(,n+);
printf("The minimum cutting is %d.\n",ans);
}
return ;
}
递归代码
数组代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<iostream>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
const int inf = 0x3f3f3f3f;
int l,n;
int cut[];
int dp[][]; int main(){
while(~scanf("%d",&l) && l != ){
memset(dp,inf,sizeof(dp));
scanf("%d",&n);
for(int i = ; i <= n ; i++){
scanf("%d",&cut[i]);
}
cut[] = ;
cut[n + ] = l;
for(int i = ; i <= n + ; i++) dp[i][i] = ;
for(int i = n + ; i >= ; i--){// 这里从n+1到0进行循环,可以先把子结构的最优解算好,在应用到父结构里面。
for(int j = i ; j <= n + ; j++){
for(int k = i ; k <= j ; k++){
dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + ][j] + cut[j] - cut[i - ]);//博主还是不太明白为什么这里的要减去cut[i - 1]而不是cut[i].
}
}
}
// int ans = DFS(0,n+1);
int ans = dp[][n + ];而且这里输出的是dp[][n + ]而不是dp[][n +]
printf("The minimum cutting is %d.\n",ans);
}
return ;
}
数组代码
一个从很久以前就开始做的梦。
Cutting Sticks UVA - 10003(DP 仍有不明白的地方)的更多相关文章
- Cutting Sticks UVA - 10003
题文: 见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
- uva 10003 Cutting Sticks 【区间dp】
题目:uva 10003 Cutting Sticks 题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费? 分析:典型的区间dp,事实上和石子归并是一样的 ...
- UVa 10003 - Cutting Sticks(区间DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 10003 Cutting Sticks 切木棍 dp
题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费. 这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗? 题目其实就是把n+1根 ...
- uva 10003 Cutting Sticks (区间dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 打开 题目大意 一根长为l的木棍,上面有n个"切点",每个点的位置为c[i] 要按照一 ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- uva 10003 Cutting Sticks(区间DP)
题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找 ...
- UVA 10003 Cutting Sticks(区间dp)
Description Cutting Sticks You have to cut a wood stick into pieces. The most affordable company ...
- 10003 Cutting Sticks(区间dp)
Cutting Sticks You have to cut a wood stick into pieces. The most affordable company, The Analog ...
随机推荐
- Python 比较 相等性 真值
1 == 操作符测试 值 的相等性: is 测试对象的一致性.注意短字符串的is相等性测试,PVM会缓存短字符串,s1 is s2 将返回true. 2 false:"", [], ...
- ubuntu16.04 重置mysql密码
先登陆服务器,找到自己的my.cnf文件,通常会在 /etc目录下(如果不在,可以用find / -name my.cnf命令找一下), 然后使用 vi my.cnf 命令编辑该文件(建议先备份),在 ...
- tableau创建蜘蛛图
tableau官方案例2:创建起点和终点的路径地图 (spider Maps) 源数据样式: 应用:交通图 步骤及注意: 将Line Group (Path ID)维度放入标记卡详细信息 默认的为聚 ...
- mini2440 裸机程序,下载到nand 里面,复制到 sdram 中不运行
按照韦东山的视频中 sdram的裸机代码,写了一份,通过 minitools 下载到 0x30000000,然后烧录到 nand中,接过不能正常运行. 尝试过多种方法后,只有一种解决方法,就是不要用 ...
- MySQL的异常问题
异常问题
- 备份mysql的批处理命令
需要工具mysqldump.exe的支持,安装mysql默认是带此工具的 批处理命令 set NOW_TIME_HH=%time:~0,2% if "%NOW_TIME_HH%" ...
- k8s pod.yml解释
apiVersion: v1kind: Podmetadata: name: yueying namespace: kube-public labels: name: testpodssp ...
- Python Learning Day1
字符串的操作 # 字符串的操作 str1 = 'my name is xxx, my age is 18.' # 优先掌握的操作: # 1.按索引取值(正向取+反向取) :只能取 print(str1 ...
- Jackknife,Bootstrap, Bagging, Boosting, AdaBoost, RandomForest 和 Gradient Boosting的区别
Bootstraping: 名字来自成语“pull up by your own bootstraps”,意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统 ...
- 题解 P1082 【同余方程】
题目 这里给出非递归的 exgcd 做法 [基础] ( 只需要非递归的同学麻烦跳过 ) 由于欧几里德算法 ( 又名辗转相除法 ) 可以帮助我们求出最大公约数,并且提出对于 \(\forall a,b\ ...