求助
  • 板块灌水区
  • 楼主_YUZIhaizhao_
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/21 21:38
  • 上次更新2023/11/4 02:59:25
查看原帖
求助
362325
_YUZIhaizhao_楼主2021/10/21 21:38

蒟蒻求助

炮兵阵地【状压DP】 (代码不知道哪里错了)

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int f[2][1001][1001],num[10001];
int s[10001],g[1001];
int m,n,t;
int main()
{
	scanf("%d%d",&m,&n);
	for(int i=1;i<=m;i++)
	    for(int j=0;j<n;j++)
	    {
	    	char s1;
			cin>>s1;
			if(s1=='P')
			    g[i]+=1<<(n-j-1);
		}
		
	for(int i=0;i<(1<<n);i++)
		if(!(i&i>>1)&&!(i&i>>2))
		{
		    s[t++]=i;
		    for(int j=0;j<n;j++)
		        num[i]=(i>>j&1);
		}
	for(int i=1;i<=m+2;i++)
	    for(int a=0;a<t;a++)//i
	        for( int b=0;b<t;b++)//i-1
	            for(int c=0;c<t;c++)//i-2
	            {
					if(!(s[a]&s[c])&&!(s[a]&s[b])&&!(s[b]&s[c])&&(g[i]&s[a])==s[a]&&(g[i-1]&s[b])==s[b])
					    f[i&1][a][b]=max(f[i&1][a][b],f[(i-1)&1][b][c]+num[s[a]]);
				}
	printf("%d",f[m+2][0][0]);	
}
2021/10/21 21:38
加载中...