区间dp 的题,第一次接触。
其中枚举出每种切割状态。
i j 从距离1开始,然后k 枚举i j 中间的切割点。
时间复杂度度为 O(n^ 3) ;
这道题不会超时,不过时间复杂度有点高。
网络上搜了一种优化叫 四边形不等式优化。
其中有三个定理, 根据定理,如果想用 ,则 w[ ][ ] 必须满足四边形不等式,至于如何判定,暂时还不清楚。需要等到以后来慢慢学习。
根据那个可以优化到O (n ^ 2)的复杂度 。
未优化代码如下:
#include<stdio.h>
#include<string.h>
const int M=100000000;
int pois[55];
int dp[55][55];
int l;
int m;
int main()
{
while(~scanf("%d",&l),l)
{
memset(dp,0,sizeof(dp));
scanf("%d",&m);
for(int i=1; i<=m; i++)
scanf("%d",&pois[i]);
pois[0]=0;
pois[m+1]=l;
for(int l=2; l<=m+1; l++)
{
for(int i=0; i+l<=m+1; i++)
{
int j=i+l;
dp[i][j]=M;
for(int k=i+1; k<j; k++)
{
if(dp[i][j]>dp[i][k]+dp[k][j]+pois[j]-pois[i])
dp[i][j]=dp[i][k]+dp[k][j]+pois[j]-pois[i];
}
}
}
printf("The minimum cutting is %d.\n",dp[0][m+1]);
}
return 0;
}