uva 10003 Cutting Sticks

来源:互联网 发布:淘宝卖家发布宝贝品牌 编辑:程序博客网 时间:2024/06/06 14:31

动态规划的题目,dp[i][j]中i和j分别代表切割点下标的起点和终点,point[k]存储第k个切割点的位置,状态转换方程:

情况1:dp[i][j] = 0;   //i+1 == j

情况2:dp[i][j] = min{dp[i][k] + dp[k][j] + (point[j]-point[i])  |  k>i&&k<j} //其他情况

由于k是位于i和j之间的,所以注意迭代的顺序i是递减的,j是递增的。好像输入的切割点本来就是递增的,我没有对切割点进行排序也过了,严谨一点的话要先排序。

#include <stdio.h>#defineINF999999999int point[60];int dp[60][60];void func(int len, int n){int i, j, k;int temp;for(i=n; i>=0; i--){for(j=i+1; j<=n+1; j++){if(j == i+1){dp[i][j] = 0;}else{dp[i][j] = INF;for(k=i+1; k<=j-1; k++){temp = dp[i][k] + dp[k][j] + point[j] - point[i];if(dp[i][j] > temp)dp[i][j] = temp;} }}}printf("The minimum cutting is %d.\n", dp[0][n+1]);}int main(void){int len, n, i;//freopen("input.dat", "r", stdin);while(scanf("%d",&len), len){scanf("%d", &n);point[0] = 0;point[n+1] = len;for(i=1; i<=n; i++){scanf("%d", point+i);}func(len, n);}return 0;}


0 0
原创粉丝点击