本题两种树形dp方式的疑问(边读边算)(读完再算)
查看原帖
本题两种树形dp方式的疑问(边读边算)(读完再算)
141335
qwq2519楼主2020/9/6 22:16
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=(k+1);++i)
#define drp(i,j,k) for(register int i(j);i>=k;--i)
using namespace std;
const int N=3007;
inline void read(int &x) {
	x=0;
	register char ch=getchar();
	int w=0;
	while(ch>'9'||ch<'0') {
		w|=ch=='-';
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=(x<<1)+(x<<3)+(ch&15);
		ch=getchar();
	}
	w?x=~(x-1):x;
}

int n;
int val[N][N],cost[N][N];
int f[N][N],a[N],b[N];
inline void dfs(int x) {
	int cost,num;
	read(cost);read(num);
	cost*=2;
	if(num) {
		rep(i,1,num) read(a[i]),read(b[i]);
		
		rep(i,1,num) 
		drp(j,n,cost+b[i])
		  f[x][j]=max(f[x][j-b[i]]+a[i],f[x][j]);//01背包 
	}
	else {
		dfs(x<<1);
		dfs(x<<1|1);
		drp(i,n,cost)
		 rep(j,0,i-cost)
				f[x][i]=max(f[x][i],f[x<<1][j]+f[x<<1|1][i-j-cost]);
	}
}
int main() {
//	freopen("steal.in","r",stdin);
//	freopen("steal.out","w",stdout);
	read(n);
	n--;
	dfs(1);
	cout<<f[1][n];
	return 0;
}

dfs中的else 的外重循环i 是枚举父亲的耗时 如果是读完再dp 就是枚举物品 why

2020/9/6 22:16
加载中...