求助,关于状态转移/kk
查看原帖
求助,关于状态转移/kk
135839
Fairicle楼主2020/11/13 11:53

完整的AC代码长这样:

#include"bits/stdc++.h"
using namespace std;
#define ri register int
#define ll long long
inline int rd(){
    int x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
    return x;
}
#define N 1010
int s,f[N][610],ans;
struct node{
    int cost,val;
}a[N];
inline void init(int x){
    a[x].cost=rd(),a[x].val=rd();
    a[x].cost*=2;
    if(!a[x].val){
        init(x<<1),init(x<<1|1);
    }
}
inline void chkmax(int &x,int y){if(x<y) x=y;}
inline void dfs(int x){
    if(a[x].val) {
        for(ri i=0;i<=a[x].val;++i) f[x][i*5+a[x].cost]=i;
        return;
    }
    dfs(x<<1),dfs(x<<1|1);
    for(ri i=0;i<=s-1-a[x].cost;++i)
    for(ri j=0;j<=i;++j) chkmax(f[x][i+a[x].cost],f[x<<1][j]+f[x<<1|1][i-j]);
}
int main(){
    s=rd();
    init(1);
    dfs(1);
    for(ri i=0;i<=s-1;++i) chkmax(ans,f[1][i]);
    cout<<ans;
    return 0;
}

但是如果把转移那两行改成

for(ri i=0;i<=s-1;++i)
for(ri j=0;j<=i;++j) chkmax(f[x][i+a[x].cost],f[x<<1][j]+f[x<<1|1][i-j]);

就会 WA 掉,为什么啊/kk,感觉这样只会多转移到无用状态啊/kk

2020/11/13 11:53
加载中...