計算結果をメモする配列をlong long int型にしたら出来ました。
そりゃこれだけ大きい値が収まるわけないよね。
//入力
long long int dp[N][21];
int a[N];
//回答
void solve(){
int i,j;
dp[0][a[0]] = 1;
for (i = 0; i <= n-2; i++){
for(j = 0; j <= 20; j++){
if(j - a[i] >= 0){
dp[i][j] += dp[i - 1][j - a[i]];
}
if(j + a[i] <= 20){
dp[i][j] += dp[i - 1][j + a[i]];
}
}
}
printf("%llu\n",dp[n - 2][a[n - 1]]);
}
とりあえずメモ化再帰からループに。メモ化再帰の方でも多分問題なく解けると思うけど。
本番でこういう単純なことに気づかなかったら怖いな…
0 件のコメント:
コメントを投稿