P1133 教主的花園 動態規劃

2021-08-28 12:16:25 字數 1227 閱讀 7290

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

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

剛看到這道題的環形,我不禁想到了區間dp,但是看到後面發現每次種樹只與之前的那棵樹種的什麼有關,好像無法區間dp;

這樣就像到了f[i]表示以i點結尾的最**值,這樣狀態無法轉移,因為沒有考慮樹的種類和最高(最低),那麼就再開兩維;

狀態:f[i][j][k]表示第i個點種j樹,k==0表示比兩邊低,k==1表示比兩邊高。(1=初始化:全部歸零,列舉第乙個點種哪種樹。

轉移

f[i][1][0]=max(f[i-1][2][1],f[i-1][3][1])+a[i][1];(種10樹最低,從20樹、30樹轉移來)

f[i][2][0]=f[i-1][3][1]+a[i][2];(種20樹最低,從30樹轉移來)

f[i][2][1]=f[i-1][1][0]+a[i][2];(種20樹最高,從10樹轉移來)

f[i][3][1]=max(f[i-1][1][0],f[i-1][2][0])+a[i][3];(種30樹最高,從10樹、20樹轉移來)

因為還要考慮n和1的關係。

在每一次列舉起點後,列舉終點的最大值並用ans記錄,列舉的終點狀態範圍由起點狀態決定(自行理解)。

#include#include#includeusing namespace std;

int f[100001][4][2];

int a[100001][4];

int n,ans;

int main()

for(int j=1;j<=3;j++)

} f[1][j][1]=f[1][j][0]=a[1][j];

for(int i=2;i<=n;i++)

for(int i=1;i<=j-1;i++)

for(int i=3;i>=j+1;i--)

} printf("%d",ans);

return 0;

}

P1133教主的花園

本題是一道多維dp題目,那麼在不開啟演算法標籤的情況下怎麼去想呢,首先是題目的求的是最值,比較好想到的就是動態規劃。首先是本題的種植範圍限在一維,但是有種類要求,可以把高度10,20,30簡單理解為種類1,2,3 因為沒有其他奇奇怪怪的東西 我們需要一維記錄位置,二維記錄種類,而教主大人又有特殊審美...

P1133 教主的花園

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

洛谷 P1133 教主的花園

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