解法1.動的計画法(Dynamic Programming)を利用する解き方

2次元配列 dpdp を以下のように定義します。

dp[i][j]:=idp[i][j]:=i 個ピザを食べ、最後に食べたピザが jj 種類目のピザであるときの食べた ii 個のピザの美味しさの総和の最大値

最終的な答えは max1iMdp[N][i]\max_{1\le i \le M} dp[N][i] です。

dp[1][j]=Ajdp[1][j]=A_j です。また、 dp[i+1][j]=max1kM,kj(dp[i][k]+Aj)dp[i+1][j]=\max_{1\le k \le M,k \neq j}(dp[i][k]+A_j) です。

これらを元に max1iMdp[N][i]\max_{1\le i \le M} dp[N][i] の値が時間計算量 O(NM2)O(NM^2)で求めることができます。

( dp[i+1][j]=max1kM,kj(dp[i][k]+Aj)dp[i+1][j]=\max_{1\le k \le M,k \neq j}(dp[i][k]+A_j) の計算を工夫すれば O(NM)O(NM) で求めることもできます。)

実装

python

注意:このコードをCpythonで提出した場合TLEで出ます。pypyで提出してください。

解法2.貪欲法(Greedy Algorithm)を利用する解き方

食べられるピザの内、最も美味しさが大きいものを食べ続けるのが最適です。 具体的には、美味しさが最も大きいピザの美味しさを XX 、2番目に美味しさが大きいピザの美味しさを YY とした時、答えは N/2X+N/2Y\lceil N/2 \rceil * X + \lfloor N/2 \rfloor * Y になります。

(N/2\lceil N/2 \rceil N/2N/2 以下の最大の整数を表します。また、 N/2\lfloor N/2 \rfloor N/2N/2 以上の最小の整数を表します。)

これは時間計算量 O(MlogM)O(MlogM)O(M)O(M) で求めることができます。

実装

python