标签:
题意:把一根木棍按给定的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)
标签:
原文地址:http://blog.csdn.net/kalilili/article/details/44177353