區間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;
}