バイトの競プロメモ

主に競技プログラミング

E - Union CODE THANKS FESTIVAL 2018

E - Union

解法
漸化的にやりたい。
iまで操作して、iにある数がjになる場合の数というふうにdpを作れば
もともと置いてある数kも一つだけ決めればいいので解ける
Submission #3671982 - CODE THANKS FESTIVAL 2018

int N, K, M, H, W, Q, cou, sum;
vi A, B, C;
mint dp[310][600];
signed main() {
cin >> N;
addAll(A, N);
for (int i = 0; i <= A[0]; ++i) {
dp[0][i] = 1;
}
for (int i = 0; i < N - 1; ++i) {
for (int j = 0; j < 600; ++j) {
for (int k = 0; k <= A[i + 1]; ++k) {
if (j - k < 0)break;
if ((j - k) * 2 >= 600)continue;
dp[i + 1][j] += dp[i][(j - k) * 2];
}
}
}
mint res = 0;
for (int i = 0; i < N; ++i) {
res += dp[i][1];
}
for (int i = 2; i < 601; i *= 2) {
res += dp[N - 1][i];
}
cout << res << endl;
return 0;
}