关于最内层循环的范围
查看原帖
关于最内层循环的范围
421410
daxian楼主2022/2/11 22:38

dp函数的最内层循环,k的范围为什么是到j而不是min(j, sz[y]), 当k>sz[y]的时候,dp数组没有意义呀

但是这样写能过,改了之后过不了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 3e3 + 10;

int n, m;
int h[N], ne[N], e[N], w[N], idx;
int sz[N];
int f[N][N];
int t[N];

void add(int a, int b, int c)
{
    w[idx] = c, e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void dp(int u)
{
    for (int i = h[u]; ~i; i = ne[i])
    {
        int y = e[i];
        dp(y); sz[u] += sz[y] + 1;
        for (int j = sz[u]; j; j -- )
            for (int k = 0; k <= j; k ++ )
                f[u][j] = max(f[u][j], f[u][j - k] + f[y][k] - w[i]);
    }
}

int main()
{
    scanf("%d%d", &n, &m);
    memset(f, 0xcf, sizeof f);
    memset(h, -1, sizeof h);
    for (int i = 1; i <= n - m; i ++ )
    {
        int k;
        scanf("%d", &k);
        for (int j = 1; j <= k; j ++ )
        {
            int a, c;
            scanf("%d%d", &a, &c);
            add(i, a, c);
        }
    }

    for (int i = n - m + 1; i <= n; i ++ )
        scanf("%d", &f[i][1]);
    for (int i = 1; i <= n; i ++ )
        f[i][0] = 0;

    dp(1);

    for (int i = m; i; i -- )
        if (f[1][i] >= 0)
        {
            cout << i << endl;
            break;
        }

    return 0;
}
2022/2/11 22:38
加载中...