dp[i番目のノード][次数] := スコアの最大値 |
dp[N][2*(N-1)]
が答えになる。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <algorithm> using namespace std; class P8XGraphBuilder { public: int solve(vector<int> scores); }; int P8XGraphBuilder:: solve(vector<int> scores) { int n = scores.size(), N = n + 1; vector<vector<int>> dp(N+1, vector<int>(2*N, -1)); // dp[N+1][2*N] dp[0][0] = 0; for(int i=0; i<N; ++i) { for(int prev=0; prev<2*N; ++prev) { // 今までの次数 if(dp[i][prev] == -1) { continue; } for(int cur=1; prev+cur<=2*N-2; ++cur) { // 増やす次数 dp[i+1][prev+cur] = max(dp[i+1][prev+cur], dp[i][prev] + scores[cur-1]); } } } int res = dp[N][2*N-2]; return res; } |