您的位置:首页 > 其它

poj 1185 炮兵阵地(状态压缩DP)

2013-08-16 10:03 423 查看
当你想要让代码A掉的时候,它一直不知名的wa,那绝对是一件非常痛苦的事儿;但是当你想要代码出点儿bug的时候,它测试数据全部通过,提交之后AC,其实也蛮蛋疼的。

因为刚学状压,所以我顺着思路把这个代码写出来,想着绝对bug满天飞,然后我就在debug的过程中来理解这个算法的各种细节。结果,它A了!

然后我就只能郁郁寡欢地来写题解了。

#include<stdio.h>
#include<string.h>
#define N 12
int dp[105][65][65],st[65],mark[105]
,flag[105],num[1<<N];
int m,n,ss;
int fun(int x)
{
int k;
k=0;
while(x)
{
if(x&1) k++;
x>>=1;
}
return k;
}
int Max(int x,int y)
{
if(x>y)
return x;
return y;
}
void Init()
{
int tt,i,j;
j=0;tt=1<<n;
for(i=0;i<tt;i++)
{
if(!(i&i<<1)&&!(i&i<<2))
st[j++]=i;
}
ss=j;
for(i=1;i<=m;i++)
{
flag[i]=0;
for(j=1;j<=n;j++)
flag[i]=(flag[i]<<1)+mark[i][j];
}
for(i=0;i<ss;i++)
num[i]=fun(st[i]);
return ;
}
int judge(int x,int y)
{
if((x&flag[y])==x)
return 0;
return 1;
}
void Output()
{
int i,j,k,l;
memset(dp,-1,sizeof(dp));
for(i=0;i<ss;i++)
{
if(judge(st[i],1))
continue;
for(j=0;j<ss;j++)
dp[1][j][i]=num[i];
}
for(i=2;i<=m;i++)
{
for(j=0;j<ss;j++)
{
if(judge(st[j],i))
continue;
for(k=0;k<ss;k++)
{
if(st[j]&st[k])
continue;
for(l=0;l<ss;l++)
{
if(st[j]&st[l])
continue;
if(dp[i-1][l][k]==-1)
continue;
dp[i][k][j]=Max(dp[i][k][j],dp[i-1][l][k]+num[j]);
}
}
}
}
int max=0;
for(i=1;i<=m;i++)
{
for(j=0;j<ss;j++)
for(k=0;k<ss;k++)
max=Max(dp[i][j][k],max);
}
printf("%d\n",max);
return ;
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
getchar();
int i,j;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
char c;
scanf("%c",&c);
if(c=='P') mark[i][j]=1;
else mark[i][j]=0;
}
getchar();
}
Init();
Output();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: