10pts,求助。。。
查看原帖
10pts,求助。。。
1015796
Lingyu_fly楼主2024/7/18 09:50
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
long long n,m,maxx=-1,ans;
long long a[110],dp[110][1100][1010],s[110],num[110];
long long lowbit(long long x){
	return x&-x;
}
long long count(long long x){
	long long cnt=0;
	while(x>0){
		x-=lowbit(x);
		cnt++;
	}
	return cnt;
}
void INIT(){
	for(long long i=0;i<=(1<<m)-1;i++){
		if(!(i&(i<<1))&&!(i&(i<<2))){
			s[ans++]=i;
			num[i]=count(i);
		}
	}
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=n;i++){
		for(long long j=0;j<m;j++){
			char c;
			cin>>c;
			if(c=='P') a[i]+=1<<(m-j-1);
		}
	}
	INIT();
 	for(long long i=1;i<=n;i++){ÐÐ
		for(long long x=0;x<ans;x++){ÐÐ
			for(long long y=0;y<ans;y++){Ð
				for(long long z=0;z<ans;z++){
					if(!(s[x]&s[y])&&!(s[y]&s[z])&&!(s[z]&s[x])&&((a[i]&s[x])==s[x])&&((a[i-1]&s[y])==s[y])){
						dp[i][x][y]=max(dp[i][x][y],dp[i-1][y][z]+num[s[i]]);
					}
				}
			}
		}
	}
	for(long long x=0;x<ans;x++){
		for(long long y=0;y<ans;y++){
			maxx=max(maxx,dp[n][x][y]);
		}
	}
	printf("%lld",maxx);
	return 0;
}

上一次尝试还是在 2024-05-30 17:08:55

2024/7/18 09:50
加载中...