uva 10003 Cutting Sticks

题意:有根木头,长度l,对它切n刀,分别在c1,c2....cn位置。费用等于你当前切的木头的长度。问你最少的费用是多少。

定义dp(be,end)为从切点be到end的最少费用。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=60;
int a[N],map[N][N],dp(int,int);
bool vis[N][N];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;

        memset(a,0,sizeof(a));
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&a[i]);
        }
        m++;
        a[m]=n;
        printf("The minimum cutting is %d.\n",dp(0,m));
    }
    return 0;
}
int dp(int be,int end)
{
    if(vis[be][end]) return map[be][end];
    else if(end-be==1) {vis[be][end]=1;return 0;}
    {
        int imin=1<<30;
        for(int i=be+1;i<end;i++)
        {
            int temp=dp(be,i)+dp(i,end)+a[end]-a[be];
            imin=min(imin,temp);
        }
        vis[be][end]=1;
        map[be][end]=imin;
        return imin;
    }
}


你可能感兴趣的:(c)