10003 Cutting Sticks切割木棍
2012-06-02 22:15
288 查看
题意是一段给定长的木棍,给出切割的位置,切割长度为A和B段,最小费用为A+B.求最小费用。
读过题之后,感觉和合并石子差不多。
但是想不出状态方程。不知道怎么转移状态。看过别人的思路。
加上木棍的开始和末尾当作分割点。
递归求解在从第i个分割点到第j个分割点,最小的费用,初始d[i][i+1]=0;其它的都为MAX;
则d[0][len+1]为整段木棍切割最小费用。
属于区间上的动态规划,枚举i到j之间的分割点即可。
读过题之后,感觉和合并石子差不多。
但是想不出状态方程。不知道怎么转移状态。看过别人的思路。
加上木棍的开始和末尾当作分割点。
递归求解在从第i个分割点到第j个分割点,最小的费用,初始d[i][i+1]=0;其它的都为MAX;
则d[0][len+1]为整段木棍切割最小费用。
属于区间上的动态规划,枚举i到j之间的分割点即可。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int MAX=1<<20; const int l=60; int mind[l][l],c[l]; int len,cut; int cost(int l,int r) { if(mind[l][r]<MAX)return mind[l][r]; for(int i=l+1;i<=r-1;i++) { int temp=cost(l,i)+cost(i,r); temp+=c[r]-c[l]; if(temp<mind[l][r]) mind[l][r]=temp; } return mind[l][r]; } int main(){ int money; while(scanf("%d",&len),len) { scanf("%d",&cut); c[0]=0; for(int i=1;i<=cut;i++) scanf("%d",&c[i]); c[cut+1]=len; money=0; if(cut) { for(int i=0;i<l;i++) for(int j=0;j<l;j++) mind[i][j]=MAX; for(int i=0;i<=cut;i++) mind[i][i+1]=0; cost(0,cut+1); money=mind[0][cut+1]; } printf("The minimum cutting is %d.\n",money); } return 0; }
相关文章推荐
- UVA Problem 10003 Cutting Sticks (切割木棍)
- 【UVa 10003】【区间DP】Cutting Sticks【有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用。】
- UVa Problem 10003 Cutting Sticks (切割木棍)
- 【解题报告】uva10003_Cutting Sticks(切割木棍, dp)
- UVA 10003 Cutting Sticks 切木棍 dp
- uva 10003 切割木棍
- 例题9-9 UVA 10003 Cutting Sticks 切木棍(区间dp)
- uva 10003 一根木棍上有n个切割点 4000 每次选一个点切割,求总切割费用最小 区间DP
- 10003木棍切割问题
- UVA 10003 Cutting Sticks 切木棍 dp
- uva 10003 Cutting Sticks
- UVA - 10003 Cutting Sticks (区间dp)
- UVa 10003 - Cutting Sticks
- uva 10003 Cutting Sticks (区间dp)
- 10003 Cutting Sticks(区间dp)
- UVA - 10003 - Cutting Sticks(动态规划)
- uva10003 - Cutting Sticks
- UVa 10003 Cutting Sticks
- UVA 10003 - Cutting Sticks
- UVA - 10003 —— Cutting Sticks