テンプレートに慣れるための問題
以下の問題について、DP のテンプレートに従ってコードを書いてください。また、それぞれの計算量( など)を答えてください。
[テンプレート]
# N: データ数 dp = [None] * (N+1) dp[1] = xxxx # 1個の場合の答えを自力で考えて入力する for n in range(2, N+1): dp[n] = xxxxx # dp[1] ... dp[n-1] の情報を使って n 個の場合の答え dp[n] を計算する print(dp[N])
[問題1]
N 個の整数の最大値を求める
[問題2]
N 個の整数の平均値を求める
ヒント
中級問題
ここの問題は、テンプレートそのまま、というわけには行きません。解くべき問題を拡張する、リスト dp[ ][ ] を埋めていく順序をよく考える、などの工夫をしてください。
[問題6]
ヒント
・dp[a][b] : a 個の 'a' と b 個の 'b' で表現できる場合の数
・dp[a][b] = 先頭が 'a' の場合の数 + 先頭が 'b' の場合の数
・K 番目の文字列の先頭は 'a' と 'b' のどちら?
(解答例)
[問題8]
ヒント
・dp[a][b][c] :(寿司 1 個 a 皿、寿司 2 個 b 皿、寿司 3 個 c 皿)の時の残り回数(期待値)
・何らかの変化が発生するまでの試行回数(期待値)は、N / (a + b + c)
・変化後の状態は、dp[a-1][b][c]、dp[a+1][b-1][c]、dp[a][b+1][c] のどれか。それぞれの割合は、a : b : c
・dp のリストを埋める順番をよく考える
(解答例)