解いた問題

3/23/2012

SRM502 Div2 Hard

1000
DPする。
DP[何匹目まで見た mod 2][数字の合計 mod N][何匹が逃げた];

この実装だと、実行時間がそうとうギリギリ。
テーブルの半分を毎回初期化するのはもちろん、剰余算を少し余計にやっただけでアウト。
剰余算は四則演算よりステップ数がかかるらしいことは知ってたけど、ツラい。
class TheCowDivTwo {
public:
  int find(int N, int K)
  {
    const lli mod = 1000000007;

    const int SUM = 1000 + 1;
    const int COW = 50;

    lli dp[2][SUM][COW];
    fill(&dp[0][0][0], &dp[2 - 1][SUM - 1][COW], 0);
    dp[0][0][0] = 1;

    for (int i = 0; i < N; ++i) {
      int a = i % 2;
      int b = (i + 1) % 2;
      for (int sum = 0; sum < N; ++sum) {
        for (int cow = 0; cow <= K; ++cow) {
          dp[b][sum][cow] = dp[a][sum][cow];
          if (cow) {
            dp[b][sum][cow] += dp[a][(sum - i + N) % N][cow - 1];
          }
          dp[b][sum][cow] %= mod;
        }
      }
    }

    return dp[N%2][0][K];
  }
};

0 件のコメント :

コメントを投稿