教主有著乙個環形的花園,他想在花園周圍均勻地種上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。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩棵樹的高度都高或者...