例题9-9 UVA 10003 Cutting Sticks 切木棍(区间dp)
2016-04-30 19:07
337 查看
大体题意:
给你一个长度为L 的木棍,木棍上有n(n <= 50)个结点,切一刀的费用为当前木棍的长度值,问最后把这n个结点全部切掉的话,最小费用是多少!
思路:
用a[i] 记录第i 个结点的位置!
并把a[0] = 0,a[n+1] = L,这样做就可以处理边界情况了!
写个dp(i,j)函数记忆话搜索!
因为i j 之间必须有东西才可以处理嘛,所以直接判断i >= j-1的话,直接return 0;
因为是记忆话搜索 所以 如果d[i][j]如果不为-1的话 直接return d [i][j]
否则遍历i,j之间的东西!
转移方程为:
dp(i,k) + dp(k,j) + a[j] - a[i];
更新d[i][j]即可!
给你一个长度为L 的木棍,木棍上有n(n <= 50)个结点,切一刀的费用为当前木棍的长度值,问最后把这n个结点全部切掉的话,最小费用是多少!
思路:
用a[i] 记录第i 个结点的位置!
并把a[0] = 0,a[n+1] = L,这样做就可以处理边界情况了!
写个dp(i,j)函数记忆话搜索!
因为i j 之间必须有东西才可以处理嘛,所以直接判断i >= j-1的话,直接return 0;
因为是记忆话搜索 所以 如果d[i][j]如果不为-1的话 直接return d [i][j]
否则遍历i,j之间的东西!
转移方程为:
dp(i,k) + dp(k,j) + a[j] - a[i];
更新d[i][j]即可!
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int l,n; const int maxn = 50 + 5; int d[maxn][maxn],a[maxn]; int dp(int i,int j){ if (i >= j-1)return 0; if (d[i][j] >= 0)return d[i][j]; for (int k = i + 1; k < j; ++k){ int u = dp(i,k) + dp(k,j) + a[j] - a[i]; if (u < d[i][j] || d[i][j] == -1)d[i][j] = u; } return d[i][j]; } int main(){ while(scanf("%d",&l) == 1 && l) { scanf("%d",&n); for (int i = 1; i <= n; ++i)scanf("%d",&a[i]); a[0] = 0; a[n+1] = l; memset(d,-1,sizeof d); printf("The minimum cutting is %d.\n",dp(0,n+1)); } return 0; }
相关文章推荐
- 人月神话阅读笔记01
- fragment生命周期
- RedHat静态Ip地址配置
- 【Stanford机器学习笔记】5-Review for Chapter 1-4
- 【Unity灯光与渲染技术】unity5新版的光照系统
- struts配置
- 冲刺8
- 232. Implement Queue using Stacks
- RxJava过滤操作符
- Linux 安装Tomcat
- 第九周进度条
- 个人冲刺05
- UILabel(标签栏)、UIAlertView(警告栏)、UIActionSheet(上拉菜单)
- 进度条第九周
- jquery属性操作
- jquery属性操作
- HashMap如何存储数据的?
- BZOJ4381: [POI2015]Odwiedziny
- 大作业
- c++ 实现字符串中替换字符串,也可去掉字符串中特定字符串