UVA-10003 Cutting Sticks (区间DP)

题目大意:将一段长为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;
}

  

posted @ 2015-09-07 21:56  20143605  阅读(178)  评论(0编辑  收藏  举报