More Related Content
More from Ryunosuke Iwai (7)
DP
- 4. ナップサック問題(再掲)
●
重さ W[i] と価値 V[i] が決まっている N 個の品物
がある。重さの総和が S を超えないように品物
を選んだときの、それらの品物の価値の総和の最
大値を求めよ。
1≦N≦20
1≦W[i],V[i]≦1,000,000
1≦S≦1,000,000
●
重さを値段、価値を美味しさにすると予算内で最
- 14. 初期状態 0P
0,300
1,150
選んだ
100P
選ばなかった
1,300
選んだ
選ばなかった
100P
350P
2,150
2,-50
選んだ 選ばなかった
3,50
150
P
100
3,150 P
3 本目
0P
選んだ
選ばなかった
250P
0P
1,300
2,100
選んだ 選ばなかった
300
3,0 P
選んだ
250
3,100P
選ばなかった
50P
3,50
0P
3,150
- 22. DP の流れ
●
これを i の小さい方から更新していく
●
最終的な答えは
max(DP[n][k]) (k=0...S) が答え
- 24. 注意点
●
これでうまくいったのは、 i+1 本目を見て
いるとき、 DP[i][k] がすでに確定している
(その後に更新されることはない)から
= i が更新ごとに単調に増加しているから
●
●
後の結果が前の結果に影響するような場合
には DP を使うのは難しい
選ぶ順番によって結果が変わらないような
場合は前から見ていくことで適用できる
- 37. ヒント
●
初期状態は?
→ 最初は (0,0) にいるので dp[0][0]=1
●
状態遷移は?
→ dp[i+1][j]+=dp[i][j]
●
計算量は?
→O(W*H*2) = O(WH)
dp[i][j+1]+=dp[i][j]
- 45. ヒント
●
初期状態は?
→ 最初は 0 個見終わっていて、和が 0
→ dp[0][0]=True
●
状態遷移は?
dp[i+1][s+a[i]]=dp[i][s]
dp[i+1][s]=dp[i][s]
- 46. ヒント
●
初期状態は?
→ 最初は 0 個見終わっていて、和が 0
→ dp[0][0]=True
●
状態遷移は?
dp[i+1][s+a[i]]=dp[i][s]
dp[i+1][s]=dp[i][s]
●
計算量は?
- 47. ヒント
●
初期状態は?
→ 最初は 0 個見終わっていて、和が 0
→ dp[0][0]=True
●
状態遷移は?
dp[i+1][s+a[i]]=dp[i][s]
dp[i+1][s]=dp[i][s]
●
計算量は? → O(N*S*2) = O(NS)