Hatena::Grouptopcoder

cafelier@SRM

cafelier のSRM参加記録です。コンテスト中に考えてたことを執拗に全部書き残すとどうなるだろうかという試み本番中にこういうコードが書きたかったなあ、という後で書いた反省コードを書き残す試み

スパムが来たのでしばらくコメント欄をはてなユーザ限定にしています、すみません、

 | 

2011-12-18

SRM527 275

| 05:24 | はてなブックマーク -  SRM527 275 - cafelier@SRM

みんなDPだった。Easyだからもっと格好いい解があるのかとずっと考えてしまいました…。

  • 「Nノード & N-1エッジ & 連結 = 木」という知識だけ使う
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;
   }
};
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/cafelier/20111218
 | 

presented by cafelier/k.inaba under CC0