萌新初学状压dp,结果样例都没过((⊙o⊙)…)
查看原帖
萌新初学状压dp,结果样例都没过((⊙o⊙)…)
658786
STUDENT00楼主2022/9/27 20:47

代码很好理解的

#include<bits/stdc++.h>
using namespace std;
int n,m,a[101],p,dp[101][101][101],ans;
char c[101][11];
void work(){
	for(int i=1;i<(1<<n);i++){
		if((i&(i<<1))||(i&(i<<2))) continue;
		p++;
		a[p]=i;
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%s",c[i]+1);
	work();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=p;j++){
			int s=0,t=a[j];
			while(t){
				t&=(t-1);
				s++;
			}
			for(int z=1;z<=p;z++){
				if(a[j]&a[z]) continue;
				int maxs=0;
				for(int k=1;k<=p;k++){
					if((a[j]&a[k])||(a[z]&a[k])) continue;
					maxs=max(maxs,dp[i][z][k]);
				}
				dp[i][j][z]=maxs+s;
			}
		}
	}
	for(int i=1;i<=p;i++){
		for(int j=1;j<=p;j++) ans=max(ans,dp[n][i][j]);
	}
	printf("%d",ans);
	return 0;
}
2022/9/27 20:47
加载中...