UVa1003-Cutting sticks
试题描述
 
 将一段木棒按要求切割,每次切割都要付出与木棒长度相同的代价,求最小代价切割。
 (多组数据)
 输入描述
 长度L。
 切割点数n(n<=50)。
 n个切割点。
 输出描述
 "The minimum cutting is " + ans +"."
 输入样例
 
 100
 3
 25 50 75
 10
 4
 4 5 7 8
 0
  输出样例
 
 
 The minimum cutting is 200.
 The minimum cutting is 22.
 
简单DP
f[i][j] = min{f[i][k] + f[k][j] + a[j] - a[i] }
code:
#include <stdio.h>
#include <string.h>
#define INF 0xfffffff
int a[55];
int L, n;
int f[55][55];
int main()
{
    int i, j, c, k;
    int tmp;
    while(scanf("%d",&L),L)
    {
        scanf("%d",&n);
        for(i=1; i<=n; i++)
            scanf("%d",&a[i]);
        a[0] = 0; a[++n] = L;
        memset(f,0,sizeof(f));
        for(c=2; c<=n; c++)
        for(i=0;i<=n-c; i++)
        {
            j = i+c;
            tmp = INF;
            for(k=i+1;k<j;k++)
            if(tmp>f[i][k]+f[k][j]+a[j]-a[i])
                tmp = f[i][k]+f[k][j]+a[j]-a[i];
            f[i][j] = tmp;
        }
        printf("The minimum cutting is %d.\n",f[0][n]);
    }
    return 0;
}
 
 
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号