您的位置:首页 > 其它

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之间的分割点即可。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: