题解都没有第一维(表示第几天)
如果直接用滚动数组去掉第一维(即表示第几天的那一维),为什么不会有第 i 天从第 i−2 天转移来的情况?所以蒟蒻觉得应该在枚举到第 x 天时就统计一下共 x 天的训练计划的方案数/kel
但是现在蒟蒻代码的状态数就是立方的不知道怎么优化/kk
代码,O(n4),可以用前缀和优化到 O(n3),但是懒得写。
#include <bits/stdc++.h>
using namespace std;
namespace z {
const int N = 5e5 + 5, mod = 1e9 + 7;
void add(int &x, int y) {x += y; if (x >= mod) x -= mod;}
void sub(int &x, int y) {x -= y; if (x < 0) x += mod;}
int n, k, f[2][5005][5005][2];
void main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
cin >> n >> k;
int ans = (n == k);
f[1][k][k][0] = f[1][k][k][1] = 1;
for(int i = 2; i <= n; i++) {
for(int j = i; j <= n; j++) {
for(int k = j; k >= 1; k--) {
for(int l = k - 1; l >= 1; l--)
add(f[i&1][j][k][1], f[i-1&1][j-k][l][0]);
for(int l = n; l >= k + 1; l--)
add(f[i&1][j][k][0], f[i-1&1][j-k][l][1]);
}
}
for(int k = 1; k <= n; k++) add(ans, (f[i&1][n][k][0] + f[i&1][n][k][1]) % mod);
memset(f[i-1&1], 0, sizeof f[i-1&1]);
}
cout << ans << endl;
}
}
int main()
{
z::main();
return 0;
}