求助 n^2 dp 莫名 WA
  • 板块P8564 ρars/ey
  • 楼主iamzq
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/10/3 18:43
  • 上次更新2023/10/27 09:00:14
查看原帖
求助 n^2 dp 莫名 WA
119124
iamzq楼主2022/10/3 18:43
#include<iostream>
#include<algorithm>
#include<string>
#include<unordered_map>
#include<set>
#include<vector>
#include<cmath>
#include<queue>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#define ll long long
using namespace std;

ll read()
{
    ll s=0, t=1; char ch=getchar();
    for (; ch<'0'||ch>'9'; ch=getchar()) if (ch=='-') t=0;
    for (; ch>='0'&&ch<='9'; ch=getchar()) s=s*10+ch-'0';
    return t?s:-s;
}

const int N=5e3+5, M=1e4+5;
const ll inf=1e18;
int a[N]; ll f[N][2][N];
int he[N], ed[M], ne[M], tot, sz[N];
void add(int x, int y){ed[++tot]=y; ne[tot]=he[x]; he[x]=tot;}
void dfs(int rt, int fa) {
    sz[rt]=1;
    bool cur=0;
    for (int i=he[rt]; i; i=ne[i]) if (ed[i]!=fa) {
        dfs(ed[i], rt);
        cur^=1;
        for (int j=1; j<=sz[rt]+sz[ed[i]]; j++) f[rt][cur][j]=inf;
        for (int j=1; j<=sz[rt]; j++)
            for (int k=1; k<=sz[ed[i]]; k++)
                f[rt][cur][j+k]=min(f[rt][cur^1][j]+f[ed[i]][0][k], f[rt][cur][j]);
        sz[rt]+=sz[ed[i]];
    }
    if (cur) memcpy(f[rt][0], f[rt][1], sizeof(f[rt][0]));
    for (int i=2; i<=sz[rt]; i++) f[rt][0][1]=min(f[rt][0][1], f[rt][0][i]+a[i-1]);
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
    #endif
    int n=read(), x, y;
    for (int i=1; i<n; i++) a[i]=read();
    for (int i=1; i<n; i++) x=read(), y=read(), add(x, y), add(y, x);
    dfs(1, 0);
    printf("%lld", f[1][0][1]);
}

(不想看也可以给个AC代码方便对拍谢谢)

2022/10/3 18:43
加载中...