出了啥情况求助,最后一个点,a不了,每次只有一行,不管有几列就输出零
查看原帖
出了啥情况求助,最后一个点,a不了,每次只有一行,不管有几列就输出零
498535
xiaoxiaoxiaoxiao_li楼主2022/7/12 21:01

过了本地oj,欢欢喜喜过来刷蓝题,结果100分,最后一个点爆零,只有一行的话不管有几列他只输出零求助

#include<bits/stdc++.h>
using namespace std;
long long  n,m,f[120][1010][1010],st[10000],td[10000],top,mod=100000000,ans,num[100000];//f[][][],第一维当前行,第二维当前状态,第三维上一行状态 
bool check(int x){
	if((x&(x<<1))&&(x&(x>>1)))return 0;
	if((x&(x<<2))&&(x&(x>>2)))return 0;
	else return 1;	
}
bool find(int x,int y){
	if(x&td[y])return 0;
	else return 1;
}
long count(long i){
	int c=0;
	  while(i>0)
    {
        ++c;
        i-=i&(-i);
    }
	return c;
}
int main()
{
	cin>>m>>n;
	for(int i=1;i<=m;i++){
		 td[i]=0;
		char t;
		for(int j=1;j<=n;j++){
			cin>>t;
			if(t=='H'){
				td[i]+=(1<<(n-j));
			}
		}
	}
	for(int i=0;i<(1<<n);i++){
		if(check(i))st[++top]=i;
	}

	for(int j=1;j<=top;j++){
		num[j]=count(st[j]);
		if(find(st[j],1)){ 
			f[1][j][0]=num[j];
		}
	}
	for(int i=1;i<=top;i++)
						{
	for(int j=1;j<=top;j++)
						{
			if(!find(st[i],1))continue;
			if(st[i]&st[j])continue;
			if(!find(st[j],2))continue;
			f[2][j][i]=max(f[2][j][i],f[1][i][0]+num[j]);
		}
}
	for(int i=3;i<=m;i++){
		for(int j=1;j<=top;j++){
			if(!find(st[j],i))continue;
			for(int k=1;k<=top;k++){
				if(!find(st[k],i-1))continue;
				if(st[j]&st[k])continue;
				for(int t=1;t<=top;t++){
					if(!find(st[t],i-2))continue;
				if(((st[j]&st[t])==0)&&((st[t]&st[k])==0))
						f[i][j][k]=max(f[i][j][k],f[i-1][k][t]+num[j]);
				}
			}
		}
	}
	for(int i=1;i<=top;i++){
		for(int j=1;j<=top;j++){
			ans=max(ans,f[m][i][j]);
		}
	}
		cout<<ans;
	return 0;
}
2022/7/12 21:01
加载中...