题意:对一根长为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 ;
}

数组代码

一个从很久以前就开始做的梦。

最新文章

  1. Aspose.Words 16.8 破解版、添加自定义HTML导出Jpeg压缩质量配置
  2. 启动Tomcat一闪而过——分析及解决过程
  3. C# 线程系列三 定时器线程
  4. VS2010与水晶报表V13的打包集成小结
  5. VS2010使用TTS
  6. MyCat 学习笔记 第十篇.数据分片 之 ER分片
  7. CSS盒模型重新理解篇
  8. UIView背景渐变三种方法
  9. IBM MQ Reason 2538(MQRC_HOST_NOT_AVAILABLE) 错误原因一例
  10. ModelMap和ModelAndView
  11. 个性CMD设置方法(转载)
  12. Android 添加菜单项
  13. jQuery为啥要提供一个load()方法?
  14. 定时器(setTimeout和setInterval)调用带参函数失效解决方法
  15. 微信小程序实战--集阅读与电影于一体的小程序项目(一)
  16. 【原创】大叔经验分享(5)oozie提交spark任务如何添加依赖
  17. 细说REST API安全之防止数据篡改
  18. Android Stuido代码混淆
  19. BZOJ1209 [HNOI2004]最佳包裹 三维凸包 计算几何
  20. Django中的forms一些小点

热门文章

  1. nosql的介绍以及和关系型数据库的区别
  2. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-bookmark
  3. springboot 自定义错误jsp页面
  4. ES6中字符串的新增方法梳理
  5. 【剑指Offer】面试题13. 机器人的运动范围
  6. jmeter --- 组件
  7. PHP表单处理、会话管理、文件上传、文件处理、执行函数(10.8 第十六天)
  8. 下页小希学MVC5+EF6.2 学习记录一
  9. 二分图匹配 最大匹配数+最大点覆盖 POJ 1469+POJ 3041
  10. su鉴定故障 普通用户无法切换回root用户处理-centos7网卡速率设置