ACwing 動態規劃總論

2021-10-12 09:53:38 字數 2719 閱讀 6654

2020.12.18 19:41

經典例題1.lis(求最長上公升子串行)

題目描述:

給定乙個長度為n的數列,求數值嚴格單調遞增的子串行的長度最長是多少。

輸入格式

第一行包含整數n。

第二行包含n個整數,表示完整序列。

輸出格式

輸出乙個整數,表示最大長度。

資料範圍

1≤n≤1000,

−109≤數列中的數≤109

輸入樣例:

73 1 2 1 8 5 6

輸出樣例:

4

**```cpp            

//輸入的時候 a輸出從1到n

int a[100];

int ans; // 最大長度

int k[100]; //存放下標

void bfs(len)

for(int i=k[len]+1;i<=n;i++) }

}a[0]=-0x3f //a[0]足夠小,保證後面的數會比a[0]大

k[0]=0;

dfs(0);

//然後輸出ans即可 `**

dp方法(ac**):

#include

using

namespace std;

int a[

1000];

int dp[

1000];

intmain()

int res=0;

//存最大長度

for(

int i=

1;i<=n;i++)}

res=

max(res,dp[i]);

//更新最大長度

}//dp(i)表示以a[i]為結尾的最長子序列的長度,即最優解

//新狀態:結尾下標

//狀態總數:n

cout

}

輸入格式

第一行包含兩個整數n和m。

第二行包含乙個長度為n的字串,表示字串a。

第三行包含乙個長度為m的字串,表示字串b。

字串均由小寫字母構成。

輸出格式

輸出乙個整數,表示最大長度。

資料範圍

1≤n,m≤1000

輸入樣例:

4 5acbd

abedc

輸出樣例:

3思路:用二維陣列dp[i][j]表示字首子串a[1~i] 與b[1~j]的「最長公共子串行」的長度

ac**

#include

using namespace std;

char a[

1050];

char b[

1050];

int dp[

1050][

1050];

intmain()

}}cout<[m]

return0;

}

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

輸入格式

第一行包含整數n,表示數字三角形的層數。

接下來n行,每行包含若干整數,其中第 i 行表示數字三角形第 i 層包含的整數。

輸出格式

輸出乙個整數,表示最大的路徑數字和。

資料範圍

1≤n≤500,

−10000≤三角形中的整數≤10000

思路:可以從下往上,也可以從上往下。

從上往下的話,要麼走下面,dp[i+1][j],要麼走右下角dp[i+1][j+1]

從上往下:

#include

using namespace std;

int a[

1000][

1000];

int dp[

1000][

1000];

intmain()

}memset

(dp,

-0x3f

,sizeof

(dp));

//好像是因為資料有可能是負數,所以dp初始化為負無窮?? 歡迎指正

dp[1]

[1]=a[1]

[1];

// 一開始寫的時候這裡錯了,要記得給dp[1][1]初始化

for(

int i=

1;i<=n;i++)}

int res=0;

for(

int j=

1;j<=n;j++

)//尋找最大的

cout

}

從下往上:杭電的數塔題目

#include

using

namespace std;

intmain()

}for

(int j=

1;j<=m;j++

)for

(int i=m-

1;i>=

0;i--)}

printf

("%d\n"

,dp[1]

[1])

;}return0;

}

dp好難 orz。。。

線性DP基礎 acwing 動態規劃

注意點 1 其實就是講所有走每一步的時候求大致值就好,然後這個值又會對下面進行影響,就像自己思考問題一樣 2 然後就是需要注意一下邊界問題,因為我們這邊求最大值,所以需要對邊界進行初始化 最長上公升子串行理解 1 有一說一,樣板題,很快就容易,就是當前這個值可以由前面 轉過來然後max最大長度就行,...

AcWing 演算法基礎課 動態規劃

1 揹包問題 1 01揹包 每件物品僅用一次 可以做空間優化 dp j max dp j dp j v i w i 0,1揹包狀態均是從前一迴圈的狀態轉移 2 完全揹包 每件物品可以用無限次 完全揹包的狀態可以從當前迴圈的狀態轉移,進行優化 3 多重揹包 每件物品有不同的數量限制 可以對物品的數量限...

AcWing 327 玉公尺田 狀態壓縮動態規劃)

農夫約翰的土地由 m times n 個小方格組成,現在他要在土地裡種植玉公尺。非常遺憾,部分土地是不育的,無法種植。而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣。注意 這裡是上下左右邊緣,不是兩斜對角邊緣 現在給定土地的大小,請你求出共有多少種種植方法。土地...