DP一維消消樂與塗色問題

2021-10-03 03:41:20 字數 1876 閱讀 7010

一維消消樂是一款非常簡單的遊戲。有 顆珠子排成一排,每一顆珠子有乙個價值 (可能是負數)。

遊戲是這樣,你可以選擇如若干對相鄰的珠子,讓他們同時消去。每一對珠子的消失,都會使得總

分數加上兩顆珠子相乘的分數。注意,每個珠子只能消一次,並且珠子消去以後,還會佔位。

輸入格式

輸入第一行乙個整數 。

接下來一行輸入 個整數 。

輸出格式

輸出最大的分數。

輸出時每行末尾的多餘空格,不影響答案正確性

in ,輸出

樣例輸入8-

9-5-

4-24

-5-4

2樣例輸出

73

動態dp問題,問題的關鍵在於找到狀態描述量和狀態轉移方程

狀態描述: 1.是否與前一項合併

2.是第幾個數

用乙個二維陣列進行描述dp[i][1] 第i個數與前一項合成 當前的分數最大值.

dp[i][0] 第i個數不與前一項合成 當前的分數最大值.

狀態轉移方程

不與前一項合併dp[i][0]=max(dp[i-1][0],dp[i-1][1])

與前一項合併,則前一項不會與前一項的前一項合併

dp[i][1]=dp[i-1][0]+w[i]*w[i-1]

#include 

using namespace std;

int dp[

10005][

2];int w[

10003];

int n;

int main()

for(int i=

1;i<=n;i++

) cout<

<

max(dp[n][1

],dp[n][0

])<

return0;

}

牆壁塗色

蒜頭君覺得白色的牆面好單調,他決定給房間的牆面塗上顏色。他買了 種顏料分別是紅、

黃、藍,然後把房間的牆壁豎直地劃分成 個部分,蒜頭希望每個相鄰的部分顏色不能相

同。他想知道一共有多少種給房間上色的方案。

例如,當 時,下面就是一種合法方案。

由於牆壁是乙個環形,所以下面這個方案就是不合法的。

輸入格式

乙個整數 ,表示房間被劃分成多少部分。( )

輸出格式

乙個整數,表示給牆壁塗色的合法方案數。

輸出時每行末尾的多餘空格,不影響答案正確性

要求使用「檔案輸入輸出」的方式解題,輸入檔案為 painting.

in ,輸出檔案為 painting.out

樣例輸入

4樣例輸出183

nn =

5n 1 ≤ n ≤ 50

12

345…

9…n-3n-2

n-1n

只有乙個位置,一緯狀態,開乙個一維陣列即可

f(n)的可能性分類討論如下

1與n-1的顏色不同

在前n-1個都排好的情況下,f(n-1)*1

1與n-1顏色相同

在前n-2個都排好的情況下,n有兩種可能性,f(n-2)*2

#include 

using namespace std;

const int n =

1e3+9;

long long f[n]

;int main()

cout <

< f[n]

<

return0;

}

揹包問題(一維dp)

揹包問題可謂是經典的動態規劃問題,這裡就給出01揹包,完全揹包,多重揹包的核心內容吧。可以作為模板用哦 見 1 01揹包 w i 代表重量,v i 代表價值,v代表揹包容量 for int i 0 i w i j dp j max dp j w i v i dp j 2 完全揹包 完全揹包跟01揹包...

01揹包問題一維與二維解法

演算法思路 f i j 表示的是只看前i個物品裡面,體積為j種最大的價值 那就分為兩種,拿和不拿 1.f i j f i 1 j 你不拿的情況和f i 1 j 一致 2.f i j max f i j f i 1 j v i w i 從小到大依次計算即可 include include includ...

指標與一維陣列,二維陣列的位址問題

include void main 對於一維陣列的位址 1,值 1的問題 include void main 輸出結果 6356716 6356720 2 6356720 可以看出對位址 1是 4,是因為int型別佔四個位元組,加乙個int的位址,相當於加了四個位元組的位址。對於二維陣列的位址 1問...