这两种写法有区别吗?
查看原帖
这两种写法有区别吗?
1398636
yezhengjie0000001楼主2025/7/24 09:27

不同点:交换了单调队列入队和dp转移的位置

AC code

for(int i=1;i<=t;i++){
		int u=i-w-1;
		int h1=0,h2=0,t1=-1,t2=-1;
		for(int j=0;j<=maxp;j++){
			if(j<=as[i]){
				dp[i][j]=-j*ap[i];
			}
			dp[i][j]=max(dp[i-1][j],dp[i][j]);
			if(u>=0){
				while(h1<=t1&&q1[h1]<j-as[i]){
					h1++;
				}
				while(h1<=t1&&dp[u][q1[t1]]+q1[t1]*ap[i]<dp[u][j]+j*ap[i]){
					t1--;
				}
				q1[++t1]=j;
				dp[i][j]=max(dp[u][q1[h1]]+q1[h1]*ap[i]-j*ap[i],dp[i][j]);
			}
			
		}
		for(int j=maxp;j>=0;j--){
			if(u>=0){
				while(h2<=t2&&q2[h2]>j+bs[i]){
					h2++;
				}
				while(h2<=t2&&dp[u][q2[t2]]+q2[t2]*bp[i]<dp[u][j]+j*bp[i]){
					t2--;
				}
				q2[++t2]=j;
				dp[i][j]=max(dp[u][q2[h2]]+q2[h2]*bp[i]-j*bp[i],dp[i][j]);
			}
		}
	}

不过样例的code

	for(int i=1;i<=t;i++){
		int u=i-w-1;
		int h1=0,h2=0,t1=-1,t2=-1;
		for(int j=0;j<=maxp;j++){
			if(j<=as[i]){
				dp[i][j]=-j*ap[i];
			}
			dp[i][j]=max(dp[i-1][j],dp[i][j]);
			//dp[i][j]=max(dp[u][j],dp[i][j]);
			if(u>=0){
				while(h1<=t1&&q1[h1]<j-as[i]){
					h1++;
				}
                dp[i][j]=max(dp[u][q1[h1]]+q1[h1]*ap[i]-j*ap[i],dp[i][j]);
				while(h1<=t1&&dp[u][q1[t1]]+q1[t1]*ap[i]<dp[u][j]+j*ap[i]){
					t1--;
				}
				q1[++t1]=j;
			}
		}
		for(int j=maxp;j>=0;j--){
			if(u>=0){
				while(h2<=t2&&q2[h2]>j+bs[i]){
					h2++;
				}
                dp[i][j]=max(dp[u][q2[h2]]+q2[h]*bp[i]-j*bp[i],dp[i][j]);
				while(h2<=t2&&dp[u][q2[t2]]+q2[t2]*bp[i]<dp[u][j]+j*bp[i]){
					t2--;
				}
				q2[++t2]=j;
			}
		}
	}
2025/7/24 09:27
加载中...