样例过不了,输出0求调
查看原帖
样例过不了,输出0求调
631881
Ansz楼主2024/7/15 11:28
#include <bits/stdc++.h>
const int N = 105;
using namespace std;

int n, m, a[N], dp[N][N][N], ans = -1; vector<int> v; char ch;

int cnt(int i, int cnt = 0) {
	while (i) { i &= (i-1); cnt++; } 
	return cnt;
}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> ch;
			a[i] = (a[i] << 1) + (ch == 'P');
		}
	}
	
	for (int i = 0; i < (1<<m); i++)
		if ((i & (i >> 1)) == 0 && (i & (i >> 2)) == 0) v.push_back(i);
		
	for (int i = 0; i < v.size(); i++) dp[1][i][0] = cnt(v[i]);
	
	for (int i = 2; i <= n; i++) {
		for (int j = 0; j < v.size(); j++) {
			if ((v[j] & a[i]) != a[i]) continue;
			for (int k = 0; k < v.size(); k++) {
				if ((v[k] & a[i]) != a[i] || (v[j] & v[k])) continue;
				for (int l = 0; l < v.size(); l++) {
					if ((v[l] & a[i]) != a[i]) continue;
					if ((v[j] & v[l]) || (v[k] & v[l])) continue;
					dp[i][j][k] = max(dp[i][j][k], dp[i-1][k][l] + cnt(v[j]));
				}
			}
		}
	}
	for (int i = 0; i < v.size(); i++)
		for (int j = 0; j < v.size(); j++)
			ans = max(ans, dp[n][i][j]);
	cout << ans;
	return 0;	
} 
2024/7/15 11:28
加载中...