計數DP 種樹

2022-06-19 23:54:14 字數 1313 閱讀 1957

題目描述

事實上,小x邀請兩位奆老來的目的遠不止是玩鬥地主,主要是為了抓來苦力,替他的後花園種樹……

小x的後花園是環形的,他想在花園周圍均勻地種上n棵樹,但是奆老花園的土壤當然非同尋常,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。

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

輸入第一行為乙個正整數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

樣例輸出
11

提示

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

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

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

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

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

【題意】

1、給出一堆環形的樹木

2、每棵樹的左右必須是比他高或低。

3、每個位置上分別有三種不同的價值,請問最大價值為???

【題解】

以前就做過cf上的一道題很類似了。dp[i][j][k] = 表示第i個位置,選取  j 這個數, 繼承前面的 k  的情況,k 只有兩種情況,k - >  ' / ' 或者 ' \ ' 

然後進行狀態轉移即可。

#includeusing

namespace

std;

const

int n = 2e5+10

;int f[n][3][2] , a[n][3

] ;int

n;int

main()

}/*0 : / , 1 : \

*/for( int i = 2 ; i <= n + 1 ; i++)

int ans = 0

;

for( int i = 0 ; i < 3 ; i ++)

printf(

"%d\n

",ans);

return0;

}

dp種樹的藝術

題目描述 有n棵高度不一樣的樹要種成一行,為了讓種樹更加有藝術性,制定乙個種樹規則,希望從左邊看過去只能看到l棵樹,從右邊看過去只能看到r棵樹,請問有多少種不同的種樹方案。輸入格式 輸入包含多組資料。首先第一行包含乙個整數t,表示資料的組數。之後t行,每行包含三個數n,l,r,以空格隔開,表示樹的棵...

計數dp小結

序 除了剛開始的看了幾道題的題解,後來也自己肛出了幾道 剩下不可做的題不也沒做嗎 這些題目最大的特點是在於需要自己構造狀態,這往往會成為一道題的最大卡點 窮舉表示水不到幾分 題目選講 e 如果直接模擬,複雜度為k n2既然每一步只能往上下或往左右走,那麼我們可以把題目分解為在x軸上行走k步與在y軸上...

計數DP 劃分數

蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 n n 分解成不多於 k k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 leq n leq 300 n 1 n 300 和 k 1 leq k l...