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);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。