题意是一段给定长的木棍,给出切割的位置,切割长度为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;
}