メモ化する。
memo[長さ][これまでの合計][最後に使った数][何連続で減少しているか];
const lli mod = 1000000007; const int LEN = 40 + 1; const int SUM = 40 * 40 + 1; const int N = 40 + 1; lli memo[LEN][SUM][N][2]; lli rec(int len, int sum, int last, int cons, const vector<int> &v) { if (cons == 2) return 0; if (v.size() == len) return 1; lli &ret = memo[len][sum][last][cons]; if (ret != -1) return ret; lli total = 0; for (int n = 0; n < N; ++n) { if (v[len] == -1 || v[len] == n) ; else continue; if (n * len <= sum) { total += rec(len + 1, sum + n, n, (n < last) ? cons + 1 : 0, v); total %= mod; } } return ret = total; } class FoxAverageSequence { public: int theCount(vector <int> seq) { fill(&memo[0][0][0][0], &memo[LEN - 1][SUM - 1][N - 1][2], -1); return rec(0, 0, 0, 0, seq); } };
0 件のコメント :
コメントを投稿