problem:
p1434 [shoi2002]滑雪
solution:
d p[
i][j
]=maxif
: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喜歡滑雪這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你...