洛谷 教主的花園 動態規劃

2022-05-13 04:03:43 字數 1772 閱讀 3579

教主有著乙個環形的花園,他想在花園周圍均勻地種上n棵樹,但是教主花園的土壤很特別,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。

教主最喜歡3種樹,這3種樹的高度分別為10,20,30。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩棵樹的高度都高或者都低,並且在此條件下,教主想要你設計出一套方案,使得觀賞價值之和最高。

輸入格式:

輸入檔案garden.in的第1行為乙個正整數n,表示需要種的樹的棵樹。

接下來n行,每行3個不超過10000的正整數ai,bi,ci,按順時針順序表示了第i個位置種高度為10,20,30的樹能獲得的觀賞價值。

第i個位置的樹與第i+1個位置的樹相鄰,特別地,第1個位置的樹與第n個位置的樹相鄰。

輸出格式:

輸出檔案garden.out僅包括乙個正整數,為最大的觀賞價值和。

輸入樣例#1:

4 

1 3 2

3 1 2

3 1 2

3 1 2

輸出樣例#1:

11

【樣例說明】

第1~n個位置分別種上高度為20,10,30,10的樹,價值最高。

【資料規模與約定】

對於20%的資料,有n≤10;

對於40%的資料,有n≤100;

對於60%的資料,有n≤1000;

對於100%的資料,有4≤n≤100000,並保證n一定為偶數。

思路:這題是典型的三維動規,在這裡我用乙個三維陣列dp[i][j][k]表示前i個已經放的樹最大值,i表示當前的第i棵樹,j表示當前這個i位置種的樹的種類,1表示10m的,2為20m,3為30m的,k表示i這個樹和前面一棵樹是什麼關係,1為上公升,0為下降。

由於這個花圃是個環,用約瑟夫環那樣的解法未免有點大材小用,我們可以對第2~n棵樹進行dp動規,最後特判一下第n棵樹和第1棵樹的關係與價值,取最優值即可。

**如下:

1 #include2 #include

3int max(int a,intb)4

7int dp[100002][5][2],c[100002][5];8

intmain()

9

17for(i=2;i<=n;i++)//

尋找第2-n種情況的dp

1824

/*****************************************

*///

最後對第n棵樹與第1顆樹來個特判即可

25 ans=max(ans,dp[n][1][1]+c[1][2

]);26 ans=max(ans,dp[n][1][1]+c[1][3

]);27 ans=max(ans,dp[n][2][0]+c[1][1

]);28 ans=max(ans,dp[n][2][1]+c[1][3

]);29 ans=max(ans,dp[n][3][0]+c[1][1

]);30 ans=max(ans,dp[n][3][0]+c[1][2

]);31

/*****************************************

*/32 printf("

%d\n

",ans);

33return0;

34 }

洛谷 P1133 教主的花園

教主有著乙個環形的花園,他想在花園周圍均勻地種上n棵樹,但是教主花園的土壤很特別,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。教主最喜歡3種樹,這3種樹的高度分別為10,20,30。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩棵樹的高度都高或者...

P1133 教主的花園 動態規劃

教主有著乙個環形的花園,他想在花園周圍均勻地種上n棵樹,但是教主花園的土壤很特別,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。教主最喜歡33種樹,這3種樹的高度分別為10,20,30。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩棵樹的高度都高或...

dp 洛谷P1133 教主的花園

一開始題目看錯了,以為很水的 然後0 爆蛋之後開始想標算 想了半天就是不知道怎麼處理這個環 設f i j k 表示第i行第j列的答案 k 0表示前面比他小 k 1表示前面比他大 但是這樣我們第一位要靠第n位來更新 那我們直接不更新第一位 從第二位來,然後跑完後把n位和1位結合一下就好了 includ...