| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我是不知道我这思路 为什么会有错呢,,求大牛搭救/* Author:GavinjouElephant
* Title:
* Number:
* main meanning:
*
*
*
*/
//#define OUT
#include <iostream>
using namespace std;
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <cctype>
#include <vector>
#include <set>
#include <cstdlib>
#include <map>
#include <queue>
//#include<initializer_list>
//#include <windows.h>
//#include <fstream>
//#include <conio.h>
#define MaxN 0x7fffffff
#define MinN -0x7fffffff
#define Clear(x) memset(x,0,sizeof(x))
char Pic[105][20];
int cur[105];
int N,M;
const int maxn=1<<11;
int dp[105][maxn];
int top;
int state[1000];
int geshu[1000];
bool can(int x)
{
if(x&(x<<1))return false;
if(x&(x<<2))return false;
return true;
}
int Count(int x)
{
int ans=0;
while(x)
{
ans++;
x&=(x-1);
}
return ans;
}
void init()
{
top=0;
for(int i=0;i<(1<<M);i++)
{
if(can(i))
{
state[top]=i;
geshu[top++]=Count(i);
}
}
}
bool fit(int x,int row)
{
if(x&cur[row])return false;
return true;
}
int main()
{
#ifdef OUT
freopen("coco.txt","r",stdin);
freopen("lala.txt","w",stdout);
#endif
while(scanf("%d%d",&N,&M)!=EOF)
{
if(N==0&&M==0)break;
memset(dp,0,sizeof(dp));
init();
for(int i=0;i<N;i++)
scanf("%s",Pic[i]);
for(int i=0;i<N;i++)
{
int k=0;
for(int j=M-1;j>=0;j--)
{
if(Pic[i][j]=='H')k+=(1<<j);
}
cur[i]=k;
}
if(N>=1)
{
for(int i=0;i<top;i++)
{
if(fit(state[i],0)) dp[0][state[i]]=geshu[i];
}
}
if(N>=2)
{
for(int i=0;i<top;i++)
{
if(!fit(state[i],1))continue;
for(int j=0;j<top;j++)
{
if(!fit(state[j],0))continue;
if(state[i]&state[j])continue;
dp[1][state[i]]=max(dp[1][state[i]],geshu[j]+geshu[i]);
}
}
}
if(N>=3)
{
for(int i=2;i<N;i++)//行数
{
for(int j=0;j<top;j++)//枚举当前行当前状态可不可以
{
if(!fit(state[j],i))continue;
for(int k=0;k<top;k++)//枚举前一行的状态可不可以
{
if(!fit(state[k],i-1))continue;
if(state[j]&state[k])continue;
for(int l=0;l<top;l++)//枚举前前一行的状态可不可以
{
if(!fit(state[l],i-2))continue;
if(state[k]&state[l])continue;
if(state[j]&state[l])continue;
dp[i][state[j]]=max(dp[i][state[j]],dp[i-2][state[l]]+geshu[k]+geshu[j]);
}
}
}
}
}
int ans=0;
for(int j=0;j<top;j++)
{
if(!fit(state[j],N-1))continue;
ans=max(ans,dp[N-1][state[j]]);
}
printf("%d\n",ans);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator