教主有著乙個環形的花園,他想在花園周圍均勻地種上n棵樹,但是教主花園的土壤很特別,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。
教主最喜歡3種樹,這3種樹的高度分別為10,20,30。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩棵樹的高度都高或者都低,並且在此條件下,教主想要你設計出一套方案,使得觀賞價值之和最高。
輸入的第1行為乙個正整數n,表示需要種的樹的棵樹。
接下來n行,每行3個不超過10000的正整數ai,bi,ci,按順時針順序表示了第i個位置種高度為10,20,30的樹能獲得的觀賞價值。
第i個位置的樹與第i+1個位置的樹相鄰,特別地,第1個位置的樹與第n個位置的樹相鄰。
輸出僅包括乙個正整數,為最大的觀賞價值和。
4 1 3 2
3 1 2
3 1 2
3 1 2
【樣例說明】
第1~n個位置分別種上高度為20,10,30,10的樹,價值最高。
【資料規模】
對於20%的資料,有n≤10;
對於40%的資料,有n≤100;
對於60%的資料,有n≤1000;
對於100%的資料,有4≤n≤100000,並保證n一定為偶數。
比較明顯的dp模型,只不過雖然是環狀的,但是每個點的狀態跟確定的區間長度無關,所以只需要列舉第1棵樹的高度(特別注意當高度為20時要分下一棵樹是10還是30),鏈狀dp即可。
f[i][1..4]表示分別前i棵樹,第i棵樹的高度為10(下棵樹肯定要比它高),20(下棵樹比它高),20(下棵樹比它矮),30(下棵樹肯定要比它矮)的最大價值。轉移也顯而易見了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define n 100010
#define inf 0x3f3f3f3f
#define sqr(x) ((x) * (x))
#define pi acos(-1)
int read()
while (ch >= '0' && ch <= '9')
return x * f;
}int high[n][3];
int f[n][4];
void init()
int n;
void dp()
}int ans;
void work()
int main()
jzoj 1792 教主的花園 2018 2 7
description 問題背景 lhx教主最近總困擾於前來膜拜他的人太多了,所以他給他的花園加上了一道屏障。問題描述 可以把教主的花園附近區域抽像成乙個正方形網格組成的網路,每個網格都對應了乙個座標 均為整數,有可能為負 若兩個網格 x1,y1 x2,y2 有 x1 x2 y1 y2 1,則說這兩...
教主的花園
lhx教主最近總困擾於前來膜拜他的人太多了,所以他給他的花園加上了一道屏障。可以把教主的花園附近區域抽像成乙個正方形網格組成的網路,每個網格都對應了乙個座標 均為整數,有可能為負 若兩個網格 x1,y1 x2,y2 有 x1 x2 y1 y2 1,則說這兩個網格是相鄰的,否則不是相鄰的。教主在y 0...
教主的花園
教主有著乙個環形的花園,他想在花園周圍均勻地種上n棵樹,但是教主花園的土壤很特別,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。教主最喜歡33種樹,這3種樹的高度分別為10,20,3010,20,30。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩...