您的位置:首页 > 其它

POJ 1185 炮兵阵地(状压DP入门)

2016-03-19 10:28 495 查看
http://poj.org/problem?id=1185

状压DP:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int dp[105][100][100];
int ma[105],st[105];

int ok(int x)
{
return (x&(x<<1))+(x&(x<<2));
}

int num(int x)
{
int  sum=0;
while (x)
{
if (x&1) sum++;
x>>=1;
}
return sum;
}
int main()
{
int n,m,i,j,k,l;
char c;
cin>>n>>m;
memset(dp,0,sizeof(dp));
memset(ma,0,sizeof(ma));
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
cin>>c;
if (c=='H') ma[i]+=1<<(j-1);
}
}
int cut=0;
for (i=0;i<(1<<m);i++)
{
if (!ok(i)) st[cut++]=i;
}
for (i=0;i<cut;i++)
{
if (!(ma[1]&st[i])) dp[1][i][0]=num(st[i]);
}
for (i=2;i<=n;i++)
{
for (j=0;j<cut;j++)
{
if (ma[i]&st[j]) continue;
for (k=0;k<cut;k++)
{
if (ma[i-1]&st[k]) continue;
if (st[k]&st[j]) continue;
for (l=0;l<cut;l++)
{
if (ma[i-2]&st[l]) continue;
if (st[l]&st[j]) continue;
if (st[k]&st[l]) continue;
dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+num(st[j]));
}
}
}
}
int ans=0;
for (i=0;i<cut;i++)
{
for (j=0;j<cut;j++) ans=max(ans,dp
[i][j]);
}
cout<<ans<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: