20分WA+TLE求助
查看原帖
20分WA+TLE求助
605945
luo_xiaoran楼主2024/6/19 19:37
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,num,p[105],pd[1050][1050],dp[1050][105][1005];
signed main(){
	cin>>n>>m;
	num=(1<<m)-1;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j){
			char x;
			p[i]<<=1;
			cin>>x;
			p[i]|=(x=='P');
		}
	for(int i=0;i<=num;++i){
		bool ok=0;
		for(int o=0;o<m-2;++o)
			if((i&(1<<o))&&(i&(1<<o+1))||(i&(1<<o))&&(i&(1<<o+2))){
				ok=1;
				break;
			}
		if(ok||(i&(1<<m-2))&&(i&(1<<m-1))) continue;
		for(int j=0;j<=num;++j){
			if(pd[i][j]) continue;
			bool ko=0;
			for(int o=0;o<m-2;++o)
				if((j&(1<<o))&&(j&(1<<o+1))||(j&(1<<o))&&(j&(1<<o+2))){
					ko=1;
					break;
				}
			if(ko||(i&j)||(j&(1<<m-2))&&(j&(1<<m-1))) continue;
			pd[j][i]=pd[i][j]=1;
		}
	}
	for(int i=0;i<=num;++i) if((p[1]|i)==p[1]&&pd[0][i]) ++dp[i][1][__builtin_popcount(i)];
	for(int i=0;i<=num;++i){
		if((p[1]|i)>p[1]||(!pd[0][i])) continue;
		for(int j=0;j<=num;++j){
			if((p[2]|j)>p[2]||!pd[i][j]) continue;
			++dp[i][2][__builtin_popcount(i)+__builtin_popcount(j)];
		}
	}
	for(int i=3;i<=n;++i)
		for(int x=0,cx=0;x<=num;++x,cx=__builtin_popcount(x)){
			if((p[i-2]|x)>p[i-2]||!pd[0][x]) continue;
			for(int y=0;y<=num;++y){
				if((p[i-1]|y)>p[i-1]||!pd[x][y]) continue;
				for(int z=0;z<=num;++z){
					if((p[i]|z)>p[i]||!pd[y][z]||!pd[x][z]) continue;
					for(int cnt=__builtin_popcount(y)+__builtin_popcount(z),j=cnt+cx;j<=i*m;++j)
						dp[z][i][j]+=dp[x][i-2][j-cnt];
				}
			}
		}
	for(int j=n*m;j>=0;--j)
		for(int i=0;i<=num;++i)
			if(dp[i][n][j]){
				cout<<j;
				return 0;
			}
	return 0;
}
2024/6/19 19:37
加载中...