您的位置:首页 > 其它

UVA-10003 Cutting Sticks (区间DP)

2015-09-07 21:56 411 查看
题目大意:将一段长为L的木棒在给定的n个切割点切开,每切一次的花费等于当前木棒的长度。求切成n+1段的最小花费。

题目分析:区间DP。定义dp(i,j)表示切割区间i~j的花费,则 f(i,j)=min(f(i,k)+f(k,j))+dist(i,j)。时间复杂度为n3。

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
const int INF=100000000;
int a[55],dp[55][55],n;
void DP()
{
for(int l=0;l<=n+1;++l){
for(int i=0;i+l<=n+1;++i){
int r=i+l;
dp[i][r]=INF;
if(l==0)///l为0说明现在是第一刀。
dp[i][r]=a[n+1]-a[0];
if(l==1)///l为1说明现在不用切割。
dp[i][r]=0;
for(int k=i+1;k<r;++k)
dp[i][r]=min(dp[i][r],dp[i][k]+dp[k][r]+a[r]-a[i]);
}
}
}
int main()
{
int l;
while(scanf("%d",&l)&&l)
{
scanf("%d",&n);
a[0]=0;
for(int i=1;i<=n;++i)
scanf("%d",a+i);
a[n+1]=l;
sort(a,a+n+2);
DP();
printf("The minimum cutting is %d.\n",dp[0][n+1]);
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: