POJ 1185 炮兵阵地 G++ 状态压缩dp 没掌握

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
//英语        看博友好分析     抄博友程序      状态压缩dp      没掌握 
int da[200];
int st[200];//状态 
int sum[200];
int dp[108][80][80]; 
int cal(int x)
{
	int js=0;
	while(x)
	{
		if(x&1)
		{
			js++;
		}
		x=x>>1;
	}
	return js;
}
int main()
{
	int n,m;
	//cin>>n>>m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<m;j++)
		{
			//char c;
			//cin>>c;
	        char ch=getchar();
	        while(ch!='P' && ch!='H') ch=getchar();			
			if(ch=='H')//背 
			{
				da[i]|=(1<<j);
			}
		}
		//cout<<da[i]<<endl;
	}
	int tot=0;
	for(int i=0;i<(1<<m);i++)
	{
		if(!(i&(i<<1))&&!(i&(i<<2)))//1代表p  背 
		{
			st[++tot]=i; sum[tot]=cal(i);
			//cout<<i<<" "<<cal(i)<<endl;	
		}
	}
	for(int i=1;i<=tot;i++)//抄博友程序 
	{
		if(!(st[i]&da[1]))
		{
			dp[1][1][i]=sum[i];//背 
			//cout<<i<<endl;
		}
	}
	for(int i=1;i<n;i++)//背 
	{
		for(int j=1;j<=tot;j++)
		{
			for(int k=1;k<=tot;k++)
			{
				if(!(st[j]&st[k])&&dp[i][j][k])//背  j向上二层的状态    k向上一层的状态 
				{
					for(int l=1;l<=tot;l++)
					{
						if(!(st[l]&st[j]) && !(st[l]&st[k]) && !(st[l]&da[i+1]))//背
						{
							dp[i+1][k][l]=max(dp[i+1][k][l],dp[i][j][k]+sum[l]); 
						} 
					} 
				} 
			}
		}
	}
	int jg=0;
	for(int i=1;i<=tot;i++)
	{
		for(int j=1;j<=tot;j++)
		{
			jg=max(jg,dp[n][i][j]);
		}
	}
	cout<<jg<<endl; 
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值