C. Gerrymandering 【Codeforces Round 978 (Div. 2)】

C. Gerrymandering

思路:

动态规划

dp[i][j] 表示前i列,末尾是第j种情况下,A的最大得票。

j是第i和i+1列的分布情况,分为0,1,2三种类型:

转移的话只需要搞清楚j=0和j=1的情况即可,j=2与j=1的行是相反的。注意到转移时如果第一行选择横向的连续三格,那么第二行也必须选择横向的三格才能保证不出现漏格。

j=0: 可以转为dp[i+3][0] 、dp[i+1][1] 、dp[i+1][2]

j=1: 可以转为dp[i+2][0] 、dp[I+3][1]

j=2: 可以转为dp[i+2][0] 、dp[I+3][2]

代码:

cpp 复制代码
#include <bits/stdc++.h>
#define endl '\n'
#define int long long 
#define pb push_back
#define pii pair<int,int>
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
using namespace std;
int dp[100005][3];
int c[100005][3];
void solve() {
	memset(dp,-1,sizeof(dp)); //注意初始化dp数组为负
	dp[0][0]=0;
	int n;
	cin>>n;
	for(int j=1;j<=2;j++){
		for(int i=1;i<=n;i++){
			char x;
			cin>>x;
			if(x=='A')c[i][j]=1;
			else c[i][j]=0;
		}
	}
	
	for(int i=0;i<=n;i++){
		for(int j=0;j<=2;j++){
			int val=dp[i][j];
			if(val<0)continue;
			if(j==0){
				int vl=((c[i+1][1]+c[i+2][1]+c[i+3][1])/2 + (c[i+1][2]+c[i+2][2]+c[i+3][2])/2 ) ; //vl是投A的票数
				dp[i+3][0]=max(val+vl,dp[i+3][0]);	
				vl = (c[i+1][1]+c[i+1][2]+c[i+2][1])/2;
				dp[i+1][1]=max(val+vl,dp[i+1][1]);
				vl = (c[i+1][1]+c[i+1][2]+c[i+2][2])/2;
				dp[i+1][2]=max(val+vl,dp[i+1][2]);
			}
			if(j==1){
				int vl=(c[i+1][2]+c[i+2][1]+c[i+2][2])/2;
				dp[i+2][0]=max(val+vl,dp[i+2][0]);
				vl=((c[i+2][1]+c[i+3][1]+c[i+4][1])/2 + (c[i+1][2]+c[i+2][2]+c[i+3][2])/2 );
				dp[i+3][1]=max(val+vl,dp[i+3][1]);	
			}
			if(j==2){
				int vl=(c[i+1][1]+c[i+2][1]+c[i+2][2])/2;
				dp[i+2][0]=max(val+vl,dp[i+2][0]);
				vl=((c[i+2][2]+c[i+3][2]+c[i+4][2])/2 + (c[i+1][1]+c[i+2][1]+c[i+3][1])/2 );
				dp[i+3][2]=max(val+vl,dp[i+3][2]);	
			}
		}
	}
//	
//	for(int i=0;i<=n;i++){
//		for(int j=0;j<3;j++){
//			cout<<"dp["<<i<<"]["<<j<<"]="<<dp[i][j]<<" ";
//		}
//		cout<<endl;
//	}
	cout<<dp[n][0]<<endl;
	
	
}

signed main() {
	cin.tie(0)->ios::sync_with_stdio(0);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}
相关推荐
小白学习记录5555514 分钟前
vs2019无法自动补全QT代码
c++
小糯米60132 分钟前
C++ 单调栈原理与模板
开发语言·c++·算法
Sakinol#43 分钟前
Leetcode Hot 100 ——多维动态规划
算法·leetcode·动态规划
XZXZZX1 小时前
ATCODER ABC 450 C题解
c++·算法·ccf csp
像素猎人1 小时前
差分数组【自用笔记】【c++】
c++·笔记·算法
kyle~1 小时前
ROS2 Control
c++·嵌入式硬件·机器人·ros2
xiaoye-duck1 小时前
《算法题讲解指南:优选算法-哈希表》--58.存在重复元素I,59.存在重复元素II,60.字母异位词分组
数据结构·c++·哈希算法
hetao17338371 小时前
2026-03-26 ZYZ28-CSP-XiaoMao Round 2 hetao1733837 的 record
c++·算法
火柴-人1 小时前
用 AI 调试渲染 Bug:renderdoc-mcp 进阶工作流
c++·人工智能·图形渲染·claude·codex·mcp·renderdoc
梓䈑1 小时前
【CMake】cmake实现属性传递的秘密(目标的默认输出路径 以及 如何修改输出路径)
c++·cmake