競プロ第10回-Normal

kidman7

自己紹介

理学部2回生 kidman7

はやくコロナウイルスが終息してほしいと願っています

もう、オンライン授業は嫌だ...(やる気の問題)

 

誰かと遊びに行きたい(カラオケとか...)

今日は復習します!

実装練習......???

内容

  • 探索
  • DP
def is_easy():
    return false
    
if __name__=="__main__":
    print(is_easy())
    

探索

  • 全探索
    • DFS
    • BFS
    • bit全探索

問題を解いていきましょう!!

問題1

実装してみましょう!!

とりあえず、10分で方針立ててみてください

実装できたら提出して...ください。

 

できればbit全探索で解いてみてください

今日のコンテストのA問題です。

解説

\(N = 15\)なので、買うか買わないかか全部試せばいい!!

それをbitで管理する。

 

例:1000110

このとき、1,2,6番目が正直者とする。(0-indexed)

((x >> i) & 1 == true となるとき)

 

まあDFSでも解けるんですけども...

問題2

コンテストBに置けませんでした。

vjudgeにまだ用意されてない...

探索というよりはグラフの練習問題的なもの

実装練習ということで...(そんなに難しくはないと思う)

 

これは5分!!

(もう解いてる人も多い...かな)

解説

素直に隣接リストを使って更新しましょう!!

更新する場所はそんなに多くないので

素直にやったらいいですよ!!

 

とりあえず、グラフ苦手な人向けに用意しました。

問題3

これはどうやって解きましょうか??

とりあえず、グラフと探索問題ということで

これを。

 

コンテストB問題です。

解説

部屋1につながってる部屋(ここでは部屋2)は

部屋1を道しるべとして指していたらOK

 

部屋2につながってる部屋は

部屋2を道しるべとして指しておけばOK

 

これをすればいい!

ただDFSだと最短性が保証されない....

(もしこれが木なら保証される)

 

よってBFSで探索しましょう!!

DP

種類はいっぱいあるけれど、通常のDPで

(区間DP入れたのは内緒)

問題1

確率DPです。

とりあえずこれを準備してみました

 

考えれば多分...できると思います

10分でいきましょう

解説

dp[i][j]を

i枚目までにj枚表が出る確率とします。

 

そうするとうまくいきそう!!

 

答えは半数以上の確率なので

dpの結果を足し合わせよう

 

もうちょっと骨のある問題がいいですかね。

問題2

DP問題では少し有名な問題で

連鎖行列積といい、行列の複数の積を

計算量をへらして求めるものです。

10分!!

解説

区間\(dp[i][j]\)を行列\(i\)番目から\(j\)番目までの

最小計算回数とする。

 

そうすると

\(dp[m][n] = \min dp[m][k] + dp[k+1][n] + p_mp_kp_n\)

幅とkを動かしていくことで答えが求められる

(幅\(i\)ごとにkをすべて見ていく)