| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 21381 | Accepted: 8290 | 
Description

Input
Output
Sample Input
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
Sample Output
6
Source
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 105;
int sta[MAX], stnum[MAX], f[MAX];
int dp[MAX][MAX][MAX];
char s[MAX][15];
int main()
{
	int n, m, cnt = 0;
	scanf("%d %d", &n, &m);
	for(int i = 0; i < n; i++)
		scanf("%s", s[i]);
	memset(f, 0, sizeof(f));
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
			if(s[i][j] == 'H')
				f[i] += (1 << j);
	for(int j = 0; j < (1 << m); j++)
	{
		int tmp = j;
		if((j & (j << 1)) || (j & (j << 2)))
			continue;
		while(tmp)
		{
			stnum[cnt] += (tmp & 1);
			tmp >>= 1;
		}
		sta[cnt ++] = j;
	}
	for(int i = 0; i < cnt; i++)
	{
		if(f[0] & sta[i])
			continue;
		dp[0][i][0] = stnum[i];
	}
	for(int i = 0; i < cnt; i++)
	{
		if(f[1] & sta[i])
			continue;
		for(int j = 0; j < cnt; j++)
		{
			if(f[0] & sta[j])
				continue;
			if(sta[i] & sta[j])
				continue;
			dp[1][i][j] = max(dp[1][i][j], dp[0][j][0] + stnum[i]);
		}
	}
	for(int r = 2; r < n; r++)
	{
		for(int i = 0; i < cnt; i++)
		{
			if(f[r] & sta[i])
				continue;
			for(int j = 0; j < cnt; j++)
			{
				if(f[r - 1] & sta[j])
					continue;
				if(sta[i] & sta[j])
					continue;
				for(int k = 0; k < cnt; k++)
				{
					if(f[r - 2] & sta[k])
						continue;
					if((sta[i] & sta[k]) || (sta[j] & sta[k]))
						continue;
					dp[r][i][j] = max(dp[r][i][j], dp[r - 1][j][k] + stnum[i]);
				}
			}
		}
	}
	int ans = 0;
	for(int i = 0; i < cnt; i++)
		for(int j = 0; j < cnt; j++)
			ans = max(ans, dp[n - 1][i][j]);
	if(n == 0 || m == 0)
		printf("0\n");
	else
		printf("%d\n", ans);
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/tc_to_top/article/details/47003491