您的位置:首页 > 其它

状态压缩 DP | 搜索

2013-01-27 16:27 316 查看
hdu 2280(DP)
View Code

//22:54
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
using namespace std;
const int N=110;
int a
;
int num
;
int mp
;
int dp
[60][60];
int n,m,sz;
void init()
{
sz=0;
for (int i=0;i<(1<<m);i++){
if ((i&(i>>1))||(i&(i<<1))) continue;
if ((i&(i>>2))||(i&(i<<2))) continue;
if ((i&1) || (i&(1<<(m-1)))) continue;
a[sz++]=i;
//      cout<<i<<" ";
}
// cout<<endl;
//  cout<<sz<<endl;
for (int i=0;i<sz;i++){
num[i]=0;
for (int j=0;j<m;j++)
if (a[i]&(1<<j)) num[i]++;
//  cout<<num[i]<<" ";
}
// cout<<endl;
}
int main()
{
int maxn;
// freopen("D:\in.txt","r",stdin);
scanf("%d",&maxn);
while (maxn--)
{
scanf("%d%d\n",&n,&m);
for (int i=0;i<n;i++){
char s[10];
gets(s);
mp[i]=0;
for (int j=m-1;j>=0;j--){
if (s[j]=='#')
mp[i]|=1<<(m-j-1);
}
}
if (n<3){
printf("0\n");
continue;
}
init();
memset(dp,0,sizeof(dp));
for (int i=0;i<sz;i++){
if((mp[1]&a[i])||(mp[0]&a[i])||(mp[2]&a[i])) continue;
if ((mp[1]&(a[i]>>1))||(mp[1]&(a[i]<<1))) continue;
dp[1][i][0]=num[i];
}

for (int c=2;c<n-1;c++){
for (int i=0;i<sz;i++){
if ((mp[c]&a[i])||(mp[c-1]&a[i])||(mp[c+1]&a[i]))continue;
if ((mp[c]&(a[i]>>1))||(mp[c]&(a[i]<<1)))continue;
for (int j=0;j<sz;j++){
if ((mp[c-1]&a[j])||(mp[c-2]&a[j])||(mp[c]&a[j]))continue;
if ((mp[c-1]&(a[j]>>1))||(mp[c-1]&(a[j]<<1)))continue;
for (int k=0;k<sz;k++){
if ((mp[c-2]&a[k])||(mp[c-1]&a[k]))continue;
if ((mp[c-2]&(a[k]>>1))||(mp[c-2]&(a[k]<<1)))continue;
if ((a[i]&a[j])||(a[j]&a[k])||(a[i]&a[k])) continue;
if ((a[i]&(a[j]>>1))||(a[i]&(a[j]<<1)))continue;
if ((a[j]&(a[k]>>1))||(a[j]&(a[k]<<1))) continue;
dp[c][i][j]=max(dp[c-1][j][k]+num[i],dp[c][i][j]);
}
}
}
}
int maxv=0;
for (int i=0;i<sz;i++)
{
for (int j=0;j<sz;j++)
{
if (dp[n-2][i][j]>maxv) maxv=dp[n-2][i][j];
}
}
printf("%d\n",maxv);
}
return 0;
}


2

2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: