题意:对一根长为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 仍有不明白的地方)的更多相关文章

  1. Cutting Sticks UVA - 10003

    题文: 见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  2. uva 10003 Cutting Sticks 【区间dp】

    题目:uva 10003 Cutting Sticks 题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费? 分析:典型的区间dp,事实上和石子归并是一样的 ...

  3. UVa 10003 - Cutting Sticks(区间DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVA 10003 Cutting Sticks 切木棍 dp

    题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费. 这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗? 题目其实就是把n+1根 ...

  5. uva 10003 Cutting Sticks (区间dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:  打开 题目大意 一根长为l的木棍,上面有n个"切点",每个点的位置为c[i] 要按照一 ...

  6. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  7. uva 10003 Cutting Sticks(区间DP)

    题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找 ...

  8. UVA 10003 Cutting Sticks(区间dp)

    Description    Cutting Sticks  You have to cut a wood stick into pieces. The most affordable company ...

  9. 10003 Cutting Sticks(区间dp)

      Cutting Sticks  You have to cut a wood stick into pieces. The most affordable company, The Analog ...

随机推荐

  1. Python 比较 相等性 真值

    1 == 操作符测试 值 的相等性: is 测试对象的一致性.注意短字符串的is相等性测试,PVM会缓存短字符串,s1 is s2 将返回true. 2 false:"", [], ...

  2. ubuntu16.04 重置mysql密码

    先登陆服务器,找到自己的my.cnf文件,通常会在 /etc目录下(如果不在,可以用find / -name my.cnf命令找一下), 然后使用 vi my.cnf 命令编辑该文件(建议先备份),在 ...

  3. tableau创建蜘蛛图

    tableau官方案例2:创建起点和终点的路径地图 (spider Maps) 源数据样式: 应用:交通图  步骤及注意: 将Line Group (Path ID)维度放入标记卡详细信息 默认的为聚 ...

  4. mini2440 裸机程序,下载到nand 里面,复制到 sdram 中不运行

    按照韦东山的视频中 sdram的裸机代码,写了一份,通过 minitools 下载到 0x30000000,然后烧录到 nand中,接过不能正常运行. 尝试过多种方法后,只有一种解决方法,就是不要用 ...

  5. MySQL的异常问题

    异常问题

  6. 备份mysql的批处理命令

    需要工具mysqldump.exe的支持,安装mysql默认是带此工具的 批处理命令 set NOW_TIME_HH=%time:~0,2% if "%NOW_TIME_HH%" ...

  7. k8s pod.yml解释

    apiVersion: v1kind: Podmetadata:  name: yueying  namespace: kube-public  labels:    name: testpodssp ...

  8. Python Learning Day1

    字符串的操作 # 字符串的操作 str1 = 'my name is xxx, my age is 18.' # 优先掌握的操作: # 1.按索引取值(正向取+反向取) :只能取 print(str1 ...

  9. Jackknife,Bootstrap, Bagging, Boosting, AdaBoost, RandomForest 和 Gradient Boosting的区别

    Bootstraping: 名字来自成语“pull up by your own bootstraps”,意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统 ...

  10. 题解 P1082 【同余方程】

    题目 这里给出非递归的 exgcd 做法 [基础] ( 只需要非递归的同学麻烦跳过 ) 由于欧几里德算法 ( 又名辗转相除法 ) 可以帮助我们求出最大公约数,并且提出对于 \(\forall a,b\ ...