#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1050;
const int INF=0x3f3f3f3f;
int l,n;
int a[maxn];
int d[maxn][maxn];
int main()
{
while(scanf("%d",&l)!=EOF)
{
if(l==0)
break;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
a[0]=0;
a[n+1]=l;
memset(d,0,sizeof(d));
for(int i=1;i<=n+1;i++)
{
for(int j=0;j<=n+1;j++)
{
int p=j+i;
int mins=INF;
if(p>n+1) break;
for(int k=j+1;k<p;k++)
{
int temp=d[j][k]+d[k][p]+a[p]-a[j];
if(mins>temp)
mins=temp;
}
if(mins!=INF) d[j][p]=mins;
}
}
printf("The minimum cutting is %d.\n",d[0][n+1]);
}
return 0;
}
这个题的解法还是比较明确的,这个实际上是和矩阵连乘问题有些类似的,这个需要把低一级的棍子切割费用算出来后,再去算多了一个切点的更高级的棍子切割的费用。
特别注意这个在考虑跑循环的时候要注意循环要以区间长度,也就是纳入的切点数目来累增的顺序来进行循环,也就是d【i】【j】要以j-i递增的方法进行最外面的循环,这个是需要特别注意的,因为长区间的值依赖于短区间的值。