poj1185
分析
自己先写了一遍,结果没有多开一维,好菜啊,对动规的理解还不是很深入,而且自己之前写的代码也很繁杂,做的时候还是多思考吧。先预处理所有情况,由dp值是不是为-1判断前一个阶段可行不可行。
题目
http://poj.org/problem?id=1185
代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std;
int n,m;
int dp[110][70][70];
int cur[110];
int state[70];
char data[110][20];
int one[70];
int num;
bool ok(int x)
{
if(x&(x<<1))
return 0;
if(x&(x<<2))
return 0;
return 1;
}
void init()
{
num=0;
for(int i=0; i<(1<<m); i++)
if(ok(i))
state[++num]=i;
}
int getone(int x)
{
int cnt=0;
while(x!=0)
{
if(x%2==1)
cnt++;
x/=2;
}
return cnt;
}
bool fit(int x,int k)
{
if(cur[k]&x) return 0;
return 1;
}
int main()
{
scanf("%d %d",&n,&m);
init();
for(int i=1; i<=n; i++)
scanf("%s",data[i]+1);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(data[i][j]=='H')
cur[i]+=(1<<(j-1));
memset(dp,-1,sizeof(dp));
for(int i=1; i<=num; i++)
{
one[i]=getone(state[i]);
if(fit(state[i],1))
dp[1][1][i]=one[i];
}
for(int i=2; i<=n; i++)
{
for(int t=1; t<=num; t++)
{
if(!fit(state[t],i))
continue;
for(int j=1; j<=num; j++)
{
if(state[t]&state[j])
continue;
for(int k=1; k<=num; k++)
{
if(state[t]&state[k])
continue;
if(dp[i-1][j][k]==-1)
continue;
dp[i][k][t]=max(dp[i][k][t],dp[i-1][j][k]+one[t]);
}
}
}
}
int ans=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=num; j++)
for(int k=1; k<=num; k++)
ans=max(ans,dp[i][j][k]);
printf("%d\n",ans);
return 0;
}