[JL]最後的晚餐 動態規劃(DP) codevs5318

[JL]最後的晚餐

TimeLimit:1000MS  MemoryLimit:1000KB

64-bit integer IO format:%lld

Problem Description

【題庫搜索“JL”查看更多建蘭題庫題目】

話說YZJ編的某程序超時了1000倍(- -!),所以他不得不在自己家門口親眼見證這個電影般的場景。雖然他不想錯過這個美妙的時刻,但是他的肚子一再抗議,要求先吃完這最後的晚餐。

現在YZJ準備依次吃n道菜。但是他只使用勺子和筷子吃,勺子和筷子可以交替使用,但是同一種菜只能用一種餐具,在開飯前他拿的是筷子。用勺子和筷子吃第i道菜的時間分別是a_i和b_i。吃第i道菜之前筷子和勺子交換的時間爲c_i。

現在請你告訴ABC按他的計劃依次吃完這n道菜,最小需要多少時間。

Input

第一行,一個正整數n(1<=n<=100)

以下n行,分別是三個正整數a_i,b_i,c_i(1<=a_i,b_i,c_i<=30000)

數據範圍及提示:

所有其他輸入<=30000 N<=20

Output

一個數,最短時間

SampleInput

3

20 40 20

10 4 25

90 100 5

 

SampleOutput

139

思路:看到這題我們會想到,這一道菜用筷子的的話,吃完這道菜要用的總的最小時間和這一道菜用勺子吃完要用的總的最小時間,那麼我們就會想到要用一個狀態來保存這個時間,但是我們會發現,一開始有兩個狀態,換勺子吃、用筷子吃,於是就要定義兩個狀態,一個是在第i道菜用勺子的總時間,另一個是第i道菜用筷子的總時間。那麼我們就可以先將開頭的狀態初始化,dp[0][1]=第一道菜用筷子的時間,dp[0][0]=第一道菜換勺子的時間,然後之後的狀態就是在之前是筷子還是湯匙之間轉換;

 

這樣就得到了狀態轉移方程;(dp[i][0]表示的是第i道菜用筷子吃的最小時間以及吃第i-1~0道菜用的最小時間,dp[i][1]同理)

#include<stdio.h>
const int N=110;
int Min(int a, int b){ return a<b?a:b; }
int dp[N][2];
int main( ){
    int n, a, b, c;
    scanf("%d", &n);
    for(int i=0; i^n; ++i){
        scanf("%d%d%d", &a, &b, &c);
        if(!i)
            dp[i][0]=a+c, dp[i][1]=b;
        else{
            dp[i][0]=Min(dp[i-1][0]+a, dp[i-1][1]+c+a);
            dp[i][1]=Min(dp[i-1][1]+b, dp[i-1][0]+b+c);
        }
    }
    printf("%d\n", Min(dp[n-1][0], dp[n-1][1]));
    return 0;
}

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