求助,请问一下为什么判断前一个状态若为inf就跳过,为什么WA了
查看原帖
求助,请问一下为什么判断前一个状态若为inf就跳过,为什么WA了
672837
DaShabby楼主2023/7/16 21:00
#include<bits/stdc++.h>
#define x first
#define y second 
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const int maxn=5e5+23;
int dp[2][maxn*2];
//dp[i][j]表示选第i头牛之后IQ为j时,EQ最高为多少 
int IQ[maxn],EQ[maxn];
int zero=4e5;
void work(){
	int n,m,k,u,v,w;
	scanf("%d",&n);
	
	for(int j=0;j<=8e5;j++)dp[0][j]=dp[1][j]=-inf;
	dp[0][zero]=dp[1][0]=0;
	for(int i=1;i<=n;i++)scanf("%d%d",&IQ[i],&EQ[i]);
	for(int i=1;i<=n;i++){
		if(IQ[i]>=0){
			for(int j=IQ[i];j<=8e5;j++){
//				if(dp[(i+1)%2][j-IQ[i]]==-inf)continue; 
				dp[i%2][j]=max(dp[(i+1)%2][j],dp[(i+1)%2][j-IQ[i]]+EQ[i]);
			}
				
		}
		else{
			for(int j=0;j<=8e5+IQ[i];j++){
//				if(dp[(i+1)%2][j-IQ[i]]==-inf)continue; //该行被注释就过了
				dp[i%2][j]=max(dp[(i+1)%2][j],dp[(i+1)%2][j-IQ[i]]+EQ[i]);
			}
		}
	}
	int MAX=0;
	for(int i=4e5;i<=8e5;i++){
		if(dp[n%2][i]>=0)MAX=max(MAX,i-zero+dp[n%2][i]);
	}
	printf("%d\n",MAX);
}
int main()
{
	int t=1;
//	scanf("%d",&t);
	while(t--)
	work();
	return 0;
}
2023/7/16 21:00
加载中...