洛谷 P1133 教主的花園

2021-07-24 11:34:26 字數 1419 閱讀 4004

教主有著乙個環形的花園,他想在花園周圍均勻地種上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一定為偶數。

f[i][1]表示此坑填1,f[i][2]表示填2,比旁邊的低,f[i][3]表示填2,比旁邊的高,f[i][4]表示填3。

一開始用for寫的總是wa,分開寫就ac了。(其實很簡單)

#include#include#include#includeusing namespace std;

const int n=100005;

int n,ans,a[n][5],f[n][5];

void dp(int k)

if(k==1)

ans=max(ans,max(f[n][3],f[n][4]));

else if(k==2)

ans=max(ans,f[n][4]);

else if(k==3)

ans=max(ans,f[n][1]);

else

ans=max(ans,max(f[n][1],f[n][2]));

}int main()

for(int i=1;i<=4;i++)

dp(i);

printf("%d\n",ans);

return 0;

}

dp 洛谷P1133 教主的花園

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

洛谷 P1133 教主的花園 題解

通往題目的大門 進入正題,需要求最大觀賞價值,那麼用於dp的f陣列首先肯定要有兩維,第一維i表示第i個位置,第二維j表示種第j種樹 我們不妨設10,20,30這三種樹為1,2,3 然後又發現,第i個位置能種什麼樹,不單單跟上乙個位置有關,還跟上上個位置有關,那這樣呼叫兩位去dp顯得十分複雜,於是我們...

洛谷 題解 P1133 教主的花園

n 10 5 o n 演算法 dp i j k 表示在第i個位置,種j 10的高度的樹,且這棵樹是否比相鄰兩棵樹高dp i 1 0 max dp i 1 2 1 dp i 1 3 1 a i 種高度為10的樹,肯定比相鄰的兩棵樹矮 dp i 2 0 dp i 1 3 1 b i 種高度為20且高度比...