rec是递归版本
notrec是非递归版本
非递归版本0.103
递归版本0.389
快了好多啊
这题50的数据范围,n^3随便过,要是数据大要加上四边形不等式优化

非递归版本转移的时候从短的向长的转移。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int dp[60][60];
const int INF=0x3f3f3f3f;
int len[100];
int n;

int rec(int i,int j)
{
//  printf("%d %d\n",i,j);
    if(dp[i][j]!=INF)
        return dp[i][j];
    for(int k=i+1;k<j;k++)
        dp[i][j]=min(dp[i][j],rec(i,k)+rec(k,j)+len[j]-len[i]);

    return dp[i][j];
}

int notrec()
{
    for(int l=2;l<=n+1;l++)
    {
        for(int i=0;i+l<=n+1;i++)
        {
            int s=i;
            int t=i+l;
            for(int k=s+1;k<t;k++)
            {
                dp[s][t]=min(dp[s][t],dp[s][k]+dp[k][t]+len[t]-len[s]);
            }
        }
    }
    return dp[0][n+1];
}

int main()
{
    int l;
    while(scanf("%d",&l)&&l!=0)
    {
        for(int i=0;i<60;i++)
            for(int j=0;j<60;j++)
                dp[i][j]=INF;
        int before=0;
        scanf("%d",&n);
        len[0]=0;
        for(int i=1;i<=n;i++)
        {
            int t;
            scanf("%d",&t);
            len[i]=t;
            dp[i-1][i]=t-before;
            before=t;
        }
        len[n+1]=l;
        dp[n][n+1]=len[n+1]-len[n];
        printf("The minimum cutting is %d.\n",notrec()-l);
    }
}

Zeus247
27 声望2 粉丝

Nothing is impossible; impossible itself say I m possible


引用和评论

0 条评论