cafelier のSRM参加記録です。コンテスト中に考えてたことを執拗に全部書き残すとどうなるだろうかという試み本番中にこういうコードが書きたかったなあ、という後で書いた反省コードを書き残す試み
スパムが来たのでしばらくコメント欄をはてなユーザ限定にしています、すみません、
あとで | |
みんなDPだった。Easyだからもっと格好いい解があるのかとずっと考えてしまいました…。
class P8XGraphBuilder { public: int solve(vector <int> scores) { scores.insert(scores.begin(), 9999999); // 1ずれてると扱いにくいので const int N = scores.size(); // 葉の個数を全パターン試して良いのを取る int best = 0; for(int leaves=1; leaves<N; ++leaves) best = max(best, scores[1]*leaves + calc(leaves, N-leaves, scores)); return best; } // 葉がleaves個、葉以外がnodes個の木のベストスコア map<pair<int,int>,int> memo; int calc(int leaves, int nodes, const vector<int>& scores) { // nodes==1 なら根を作らないといけないので全部 if( nodes == 1 ) return scores[leaves]; // メモ化 pair<int,int> key(leaves, nodes); if( memo.count(key) ) return memo[key]; // 適当にk個選んで1つのノードを親にする // この親ノードは根では無いので次数は k+1。 int best = 0; for(int k=1; k<=leaves; ++k) best = max(best, scores[k+1] + calc(leaves-k+1, nodes-1, scores)); return memo[key] = best; } };
presented by cafelier/k.inaba under