标签:
题目链接 http://acm.hust.edu.cn/vjudge/problem/19202
解题思路
cost[i][j]表示第i个切割点到第j个切割点之间的这个木棍的最小花费。
状态转移方程:cost[start][end] = cost[start][k] + cost[k][end] + num[end] - num[start];
其中 start < k < end, num存储切割点位置。
具体实现可以设0,和 l(木棍长度) 这两点为切割点。
代码
#include<stdio.h> #include<string.h> const int maxLen = 55; const int inf = 1<<31-1; int cost[maxLen][maxLen]; int num[maxLen]; int n, l; int getCost(int start, int end) { if(cost[start][end] < inf) return cost[start][end]; if(start + 1 == end) return 0; for(int k=start+1; k<end; k++) { int u; u = getCost(start, k) + getCost(k, end) + num[end] - num[start]; if(u < cost[start][end]) { cost[start][end] = u; } } return cost[start][end]; } int main() { while(scanf("%d%d", &l, &n) == 2) { for(int i=0; i<maxLen; i++) for(int j=0; j<maxLen; j++) cost[i][j] = inf; num[0] = 0; num[n+1] = l; for(int i=1; i<=n; i++) scanf("%d", &num[i]); printf("The minimum cutting is %d.\n", getCost(0, n+1)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/ZengWangli/p/5790396.html