萌新刚学 dp 1ms 求解释
查看原帖
萌新刚学 dp 1ms 求解释
1277496
psgqwq楼主2025/1/2 23:28

题解都没有第一维(表示第几天)

如果直接用滚动数组去掉第一维(即表示第几天的那一维),为什么不会有第 ii 天从第 i2i-2 天转移来的情况?所以蒟蒻觉得应该在枚举到第 xx 天时就统计一下共 xx 天的训练计划的方案数/kel

但是现在蒟蒻代码的状态数就是立方的不知道怎么优化/kk

代码,O(n4)O(n^4),可以用前缀和优化到 O(n3)O(n^3),但是懒得写。


#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;
}

2025/1/2 23:28
加载中...