2011年12月1日木曜日

できた件について

計算結果をメモする配列を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 件のコメント:

コメントを投稿