80pts求助
查看原帖
80pts求助
803348
Fire_flys楼主2024/10/21 20:10
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
long long g[3][N],c;
long long ans=-2100000000,ans2=-21000000;
long long dp[N][4],f[N];
char s[3][N];
//dp[i][0]表示截止到第i列时选上面一格的最大1-0数量,dp[i][1]表示截止到第i列时选下面一格的最大1-0数量,dp[i][2]表示第i列两格都选的最大1-0数量 
int main(){
	int T;
	cin>>c>>T;
	while(T--){
		int n,m;
		cin>>n>>m;
		ans=0;
		ans2=0;
		for(int i=1;i<=n;i++)dp[i][0]=dp[i][1]=dp[i][2]=f[i]=0;
		cin>>(s[1]+1)>>(s[2]+1);
        for(int i=1;i<=2;i++){
	         for(int j=1;j<=n;j++){
	            	if(s[i][j]=='1')g[i][j]=1;
	            	else g[i][j]=-1;
	            	//cout<<g[i][j]<<" ";
				}
				//cout<<endl;      	
		}

		//最大子段和思想 
		for(int i=1;i<=n;i++){
			long long x=g[1][i]+g[2][i];
			if(x==-2)x=-1;
			f[i]=max(f[i-1]+x,x);
			ans=max(f[i],ans);
			//cout<<"f["<<i<<"]="<<f[i]<<" ";
		}
		//cout<<endl;
		//cout<<"dp["<<1<<"][0]="<<dp[1][0]<<" dp["<<1<<"][1]="<<dp[1][1]<<" dp["<<1<<"][2]="<<dp[1][2]<<endl;
		for(int i=1;i<=n;i++){
			dp[i][0]=max(max(dp[i-1][0]+g[1][i],dp[i-1][2]+g[1][i]),g[1][i]); 
			dp[i][1]=max(max(dp[i-1][1]+g[2][i],dp[i-1][2]+g[2][i]),g[2][i]); 
			dp[i][2]=max( max( max(dp[i-1][2]+g[1][i]+g[2][i],dp[i-1][0]+g[1][i]+g[2][i]) , dp[i-1][1]+g[1][i]+g[2][i] ), g[1][i]+g[2][i]);
			ans2=max( max(dp[n][0],max(dp[n][1],dp[n][2]) ) ,ans2);
			//cout<<"dp["<<i<<"][0]="<<dp[i][0]<<" dp["<<i<<"][1]="<<dp[i][1]<<" dp["<<i<<"][2]="<<dp[i][2]<<endl;
		}
		ans=max(ans,ans2-m*2);
		cout<<ans<<endl;
		//m*2原因:若交换一个0和一个1则0的数量加1,1的数量减1,则总体数量就会减2 
	}
	return 0;
}/*0 2
5 2
11110
01001
7 1
1110000
0001111
*/

wa #10,#11,#16,#17,#22

2024/10/21 20:10
加载中...