問題はこちら
問題概要
曜日からなる一週間の各曜日に「平日」か「休日」のどちらかを割り当てる.このとき,曜日の生産量は以下のように表される.- 曜日が「休日」である場合は
- 曜日が「平日」のとき,直前の休日が日前,直後の休日が日後である場合は
一週間当たりの生産量の最大値を求めよ.
解説
曜日の前日は曜日,というように前後に繋がっているので「平日」「休日」の割り当てを決めた際にrotateをしても答えは変わりません.つまり,曜日は必ず休日としてもよいです.
次に,初日が休日で,その後平日が続くようなブロックに分解してみます.
休日日+平日日の全日からなるブロックの生産量は公式解説のと等しいです.これをとします.
すると,この問題は
- 品物の重みを
- 品物の価値を
- 品物の重みの合計の上限を
としたときの個数制限なしナップサック問題となります.
よって,この問題を時間計算量で解くことができます.
提出プログラム
https://atcoder.jp/contests/abc285/submissions/38167895 C++https://atcoder.jp/contests/abc285/submissions/38169128 Python
N = int(input()) A = list(map(int,input().split())) V = [0] * (N+1) DP = [0] * (N+1) for i in range(2,N+1): V[i] = V[i-1] + A[i//2-1] for j in range(i,N+1): DP[j] = max(DP[j], DP[j-i] + V[i]) print(DP[N])