题意:把一根木棍按给定的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; }