motu*2

DIV1目指して問題を解き続ける

AOJ 0096 Sum of 4 Integers II

概要

nが与えられたとき、a + b + c + d = n
となる組み合わせ数を求めよ。

解法

全探索だと、1000^4 なので間に合わない。

DP[i個目][合計]で数え上げをする。

コード

#include <iostream>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,n)  FOR(i,0,n)

int main()
{
    long long dp[4][4001] = {};
    REP(i, 1001) dp[0][i] = 1;
    for (int i = 1; i < 4; i++) {
        for (int j = 4000; j >= 0; j--) {
            for (int k = 0; k <= 1000; k++) {
                if (j - k < 0) break;
                dp[i][j] += dp[i - 1][j - k];
            }
        }
    }
    while (1) {
        int n;
        cin >> n;
        if (cin.eof()) break;
        cout << dp[3][n] << endl;
    }
    return 0;
}