入門dp 滑雪, 串

2021-10-07 13:01:23 字數 2645 閱讀 9774

problem:

p1434 [shoi2002]滑雪

solution:

d p[

i][j

]=max⁡if

:a[i

±1][

j±1]

i][j

]dp\left[ i\right] \left[ j\right] =\max \left\ if :a\left[ i\pm 1\right] \left[ j\pm 1\right] dp

[i][

j]=maxif

:a[i

±1][

j±1]

i][j

]需要初始化dp[

i][j

]=1dp[i][j]=1

dp[i][

j]=1

(至少要經過自己乙個點),且在dp過程中注意dp[

i±1]

[j±1

]dp\left[ i\pm 1\right] \left[ j\pm 1\right]

dp[i±1

][j±

1]不能訪問到邊界外面。

我們常規思路是給高度排序,從低點dp到高點,但是這個高度順序的記錄需要更複雜的資料結構,在四周點的選取上還要討論,比較麻煩,所以我們用記憶化搜尋來解決訪問順序問題。

code:

#include
#define fo2(i,a,b) for(int i=a;i<=b;i++)

using

namespace std;

int r,c,a[

105]

[105

],dp[

105]

[105

],mx=-1

;int

dfs(

int i,

int j)

//是取4條路的max,中間借用dp[i][j]儲存臨時max

intmain()

printf

("%d"

,mx)

;}方向陣列code:

ps.在dfs中方向陣列很常見,方便指定搜尋方向

把所有點情況都放在狀態裡,f[0

/1/2

]f[0/1/2]

f[0/1/

2]表示長度為i的沒有u的串/有u但是u後面沒有s的串/有us的串的數量

code:

#include

#define ll long long

using

namespace std;

const

int n=

1e6+5;

ll f[n][3

],ans;

const

int mod=

1e9+7;

intmain()

cout<

}

solution2:dp[i]為長度為i且包含子串行"us"的字串的數量。

dp[i+1]構成有兩類:

①前i個字元已經包含了子串行"us",後面接任意乙個字元。數量為dp[

i]∗26

dp[i]*26

dp[i]∗

26②前i個字元包含字母u,但不包含子串行"us"。後面再接乙個字元』s』即可。數量為26i

−25i

−dp[

i]26^i-25^i-dp[i]

26i−25

i−dp

[i]

code:

#include

using

namespace std;

#define ll long long

int mod=

1e9+7;

ll power

(ll a,ll b)

return res;

}ll dp[

1000100];

intmain()

dp問題 滑雪

michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 17 ...

滑雪(DP 搜尋)

michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 17 ...

POJ1088滑雪(入門級DP)

儘管是比較簡單的dp,但是很經典,記憶化搜尋加dp,找出狀態轉移方程很容易寫出來。寫出後成就感滿滿啊 雖然不是純原創.以前看過別人的思路 不多說帖 michael喜歡滑雪這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你...