UVA 10003 - Cutting Sticks (区间DP)

题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费。

区间DP

和POJ 3253-Fence Repair相似,POJ那题不是给定切割点,而是给定了需要切成的长度,所以可以用哈夫曼编码贪心做

//	Accepted	C++	0.112
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int len;
int dp[55][55];
int c[55];
int n;
int main()
{
    c[1]=0;
    while(scanf("%d",&len),len)
    {
        scanf("%d",&n);
        n+=2;
        for(int i=2;i<n;i++) scanf("%d",&c[i]);
        c[n]=len;
        for(int l=1;l<n;l++)
            for(int p=1;p+l<=n;p++)
                for(int k=p+1;k<l+p;k++)
                    dp[p][p+l]= k==p+1? dp[p][k]+dp[k][p+l]+c[p+l]-c[p] : min(dp[p][p+l],dp[k][p+l]+dp[p][k]+c[p+l]-c[p]);
        printf("The minimum cutting is %d.\n",dp[1][n]);

    }
    return 0;
}


你可能感兴趣的:(UVA 10003 - Cutting Sticks (区间DP))