求助!
查看原帖
求助!
671774
LUlululu1616楼主2023/8/10 08:47

rt,代码中 dp 转移的部分只是调换了一点顺序,为什么会导致错误?

60pts:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=505;
int n,x;
vector<int> e[maxn];
int dp[maxn][maxn][2],w[maxn],sz[maxn];
int tmp[maxn][2];
void dfs(int u)
{
	dp[u][0][0]=0,dp[u][0][1]=w[u];
	sz[u]=1;
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i];
		dfs(v);
		for(int j=sz[u]-1;j>=0;j--)
			for(int k=sz[v]-1;k>=0;k--)
			{
				if(dp[u][j][0]+max(dp[v][k][0],dp[v][k][1])>dp[u][j+k][0])
					dp[u][j+k][0]=dp[u][j][0]+max(dp[v][k][0],dp[v][k][1]);
				if(dp[u][j][1]+dp[v][k][0]>dp[u][j+k][1])
					dp[u][j+k][1]=dp[u][j][1]+dp[v][k][0];
				if(dp[u][j][1]+dp[v][k][1]>dp[u][j+k+1][1])
					dp[u][j+k+1][1]=dp[u][j][1]+dp[v][k][1];
                    //这里调换顺序
			}
		sz[u]+=sz[v];
	}
}
signed main()
{
	memset(dp,-0x3f,sizeof(dp));
	cin >>n>>x;
	for(int f,i=1;i<=n;i++)
		cin >>w[i]>>f,e[f].push_back(i);
	dfs(0);
	for(int i=n;i>=0;i--)
	{
		if(dp[0][i][0]>=x)
		{
			cout <<i<<endl;
			return 0;
		}
	}
	cout <<-1<<endl;
	return 0;
}

100pts:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=505;
int n,x;
vector<int> e[maxn];
int dp[maxn][maxn][2],w[maxn],sz[maxn];
int tmp[maxn][2];
void dfs(int u)
{
	dp[u][0][0]=0,dp[u][0][1]=w[u];
	sz[u]=1;
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i];
		dfs(v);
		for(int j=sz[u]-1;j>=0;j--)
			for(int k=sz[v]-1;k>=0;k--)
			{
				dp[u][j+k][0]=max(dp[u][j+k][0],dp[u][j][0]+max(dp[v][k][0],dp[v][k][1]));
				dp[u][j+k+1][1]=max(dp[u][j+k+1][1],dp[u][j][1]+dp[v][k][1]);
				dp[u][j+k][1]=max(dp[u][j+k][1],dp[u][j][1]+dp[v][k][0]);
                //这里调换顺序
			}
		sz[u]+=sz[v];
	}
}
signed main()
{
	memset(dp,-0x3f,sizeof(dp));
	cin >>n>>x;
	for(int f,i=1;i<=n;i++)
		cin >>w[i]>>f,e[f].push_back(i);
	dfs(0);
	for(int i=n;i>=0;i--)
	{
		if(dp[0][i][0]>=x)
		{
			cout <<i<<endl;
			return 0;
		}
	}
	cout <<-1<<endl;
	return 0;
}
2023/8/10 08:47
加载中...