0pts求调
查看原帖
0pts求调
1473266
Andy0121楼主2025/6/16 22:38

WA on#1#2#5#8#9#10#11#12

RE on#3#4#6#7

求调

#include<bits/stdc++.h>
using namespace std;
int cnt[105],p[105],mp[105];
int dp[105][105][105];
int main(){
	int n,m,b = 0;
	cin >> n >> m;
	string s;
	for(int i = 0;i < n;i++){
		cin >> s;
		for(int j = 0;j < m;j++){
			if(s[j] == 'H')mp[i]++;
			mp[i] <<= 1;
		}
	}
	for(int i = 0;i < (1<<n);i++){
		int t = 0,i1 = i;
		while(i1){
			if(i1&1) t++;
			i1 >>= 1;
		}
		cnt[i] = t;
		if(((i<<1)&i) == 0 && ((i<<2)&i) == 0 && ((i>>1)&i) == 0 && ((i>>2)&i) == 0) p[++b] = i;
		if((i&mp[0]) == 0) dp[0][i][0] = cnt[i];
	}
	for(int i = 1;i <= b;i++){
		for(int j = 1;j <= b;j++){
			if(((p[i]&p[j])|(p[j]&mp[1])) == 0){
				dp[1][j][i] = max(dp[1][j][i],dp[0][i][0]+cnt[j]);
			}
		}
	}
	for(int i = 2;i < n;i++){
		for(int j = 1;j <= b;j++){
			if((p[j]&mp[i]) == 0){
				for(int k = 1;k <= b;k++){
					if((p[k]&p[j]) == 0&&(p[k]&mp[i-1]) == 0){
						for(int l = 1;l <= b;l++){
							if((p[l]&p[k]) == 0 && (p[l]&p[j]) == 0 && (p[l]&mp[i-2]) == 0){
								dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][l]+cnt[j]);
							}
						}
					}
				}
			}
		}
	}
	int ans = 0;
	for(int i = 1;i <= b;i++){
		for(int j = 1;j <= b;j++){
			ans = max(dp[n-1][i][j],ans);
		}
	}
	cout << ans;
	return 0;
}
2025/6/16 22:38
加载中...