uva 10003 Cutting Sticks

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


發佈了59 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章