UVA 10003 - Cutting Sticks(區間DP)

題目鏈接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=944

題目DP還是比較明顯的,也比較簡單,第一眼看題以爲是貪心

dp[i][j]表示從第i個切割點到第j個切割點(注意開始時把0和length作爲切割點加入)

dp[i][j]=MIN(dp[i][k]+dp[k][j]+len[j]-len[i]) (i<k<j) 也就是枚舉切割點找最優值

感覺和矩陣鏈乘DP有點像


#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 100
int length,rec[maxn],n;
int dp[100][100];
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
#define inf 1e8
int main(){
    int i,j,k,r;
    while(scanf("%d",&length),length){
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        scanf("%d",&rec[i]);
        rec[0]=0,rec[n+1]=length;
        n++;
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++) dp[i][i]=0,dp[i][i+1]=0;
        for(i=2;i<=n;i++){
            for(k=0;k<=n-i;k++){
                dp[k][k+i]=inf;
                for(r=1;r<=i;r++)
                dp[k][k+i]=MIN(dp[k][k+i],dp[k][k+r]+dp[k+r][k+i]+rec[k+i]-rec[k]);
            }
        }
        printf("The minimum cutting is %d.\n",dp[0][n]);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章