本题大意为在给出的n个结点处切断木棍,并且在切断木棍时木棍有多长就花费多长的代价,将所有结点切断,并且使代价最小。
开始在做时没有多想就开了一个1000*1000的数组,自己测试随便一个数据都可以,但是提交后却TLE了,估计是该题的测试案例相当多吧,不然也不会超了。
后来在网上看了一下别人的答案,才猛地发现只用开一个50*50的数组就可以dp了,后来改了之后就AC。
#include <iostream>
#include<cstdio>
#include <cmath>
#include<string.h>
using namespace std;
int d[51][51];
int an[52];
int l,n;
int dp( int i, int j) //记忆化搜索
{
if( j== i+1) //不用再切断
return d[i][j]=0;
if( d[i][j]!=-1)
return d[i][j];
d[i][j] =1000000000;
int k;
for( k=i+1; k<j; k++) //依次切断中间的结点
d[i][j] = min( d[i][j], dp(i,k)+dp(k,j)+an[j]-an[i]);
return d[i][j];
}
int main()
{
while( scanf("%d",&l) &&l)
{
scanf("%d",&n);
int i;
memset(d, -1, sizeof( d));
for( i=1; i<=n; i++)
scanf("%d",&an[i]);
an[0] =0; an[n+1] =l; //添加头尾两个结点
printf("The minimum cutting is %d.\n", dp(0,n+1));
}
return 0;
}