洛谷題單 動態規劃的引入

2021-10-07 12:11:32 字數 3231 閱讀 7548

前言:好久沒做dp,又變菜了。。。

數字三角形 number ********s

思路:由題很容易可以看出狀態轉移方程:dp[i][j]=cnt[i][j]+max(cnt[i+1][j],cnt[i+1][j+1]).

ac**:

#include

#include

#include

#include

#include

using

namespace std;

#define int long long

int cnt[

1005][

1005];

signed

main()

}for

(int i = t -

2; i >=

0; i--)}

cout << cnt[0]

[0]<< endl;

return0;

}

挖地雷

思路:設dp[i]為從i地窖挖能挖到的地雷最大數。

先判斷i地窖到j地窖存不存在路,存在則dp[i]=max(dp[i],cnt[i]+dp[j]),不存在的話

dp[i]=max(dp[i],cnt[i]),但遍歷的時候是根據存不存在路判斷遍歷,這樣就很可能會漏遍歷最後乙個地窖(因為最後乙個地窖並沒有直接的給出與其他地窖的連通關係),所以需要在最後特判一下最後乙個地窖。路徑的話用乙個陣列存該節點前驅節點,隨著遍歷實時更新即可。

ac**:

#include

//挖地雷

#include

#include

#include

#include

using

namespace std;

#define int long long

int cnt[25]

;int ret[25]

[25];

int dp[25]

;int pos[25]

;signed

main()

}int ans =0;

int beg =1;

if(t ==1)

for(

int i = t -

1; i >=

1; i--

)else

dp[i]

=max

(dp[i]

, cnt[i]

+ cnt[j]);

if(dp[i]

!= k) pos[i]

= j;

int ll = ans;

ans =

max(ans, dp[i]);

if(ans != ll) beg = i;

//記錄起始點

}else}}

if(ans < cnt[t]

) cout << beg <<

" ";

for(

int i = beg; pos[i]!=0

&& pos[i]

!= i; i = pos[i]

) cout << pos[i]

<<

" "; cout << endl;

cout << ans << endl;

return0;

}

採藥

思路:01揹包模板題,不用解釋。

ac**:

#include

//採藥

#include

#include

#include

#include

using

namespace std;

#define int long long

const

int mod =

80112002

;int t[

1005

], w[

1005];

int dp[

1005][

1005];

signed

main()

for(

int i =

1; i <= b; i++

)else dp[i]

[j]= dp[i -1]

[j];}}

cout << dp[b]

[a]<< endl;

return0;

}

瘋狂的採藥

思路:完全揹包模板題,但這裡只能用一維陣列形式,因為二維會爆的很慘。。。

ac**:

#include

//瘋狂的採藥

#include

#include

#include

#include

using

namespace std;

#define int long long

int t[

10005

], w[

10005];

int dp[

10000005];

signed

main()

} cout << dp[a]

<< endl;

return0;

}

5倍經驗日

思路:01揹包模板題,唯一區別就是在藥物不夠的時候要加上失敗的經驗值,注意最後結果要乘5.

ac**:

#include

//5倍經驗日

#include

#include

#include

#include

using

namespace std;

#define int long long

int ls[

1005

], wi[

1005

], us[

1005];

int dp[

1005];

signed

main()

else dp[j]

= dp[j]

+ ls[i];}

} cout << dp[x]*5

<< endl;

return0;

}

總結:這個題單除了個別題不想看之外,其他題對於蒟蒻來講都是很友好的了,蒟蒻不易,且行且珍惜。

動態規劃 洛谷 過河卒

第 dp i j 個位置到達的可能性是第 dp i 1 j 個位置方案數 第 dp i j 1 個位置的方案數 題目中馬以 日 字形沿各方向跳出的點才是題目中所謂馬控制的九個點,而不是馬座標周圍的九個點 題目的座標系是以第四象限為平面,卒可向下或向右 dfs求路徑總數要設定邊界 1 到達目的地結束 ...

洛谷 教主的花園 動態規劃

教主有著乙個環形的花園,他想在花園周圍均勻地種上n棵樹,但是教主花園的土壤很特別,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。教主最喜歡3種樹,這3種樹的高度分別為10,20,30。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩棵樹的高度都高或者...

洛谷官方dp題單

這題是一道很好的dp入門練手題 動 f x y max f x 1 y f x 1 y 1 a x y 首先,這題為什麼會想到記憶化?知道的人直接跳過 在dfs每種情況是,可能這個點之前已經搜過了,沒必要再去搜尋了,因此不如儲存記住,就沒必要再去dfs了。me的文章 一道裸的01揹包,特別簡單。不過...