求助初学状压dp
查看原帖
求助初学状压dp
1404345
zzx20110203楼主2024/12/18 22:11
#include<bits/stdc++.h>
using namespace std;
const int minx=-1e9;
const int mod=100000000;
int m,n;
int dp[15][(1<<15)];
int a[15][15];
string jk(int x){
	string s="";
	while(x){
		if(x&1){
			s='1'+s;
		}
		else{
			s='0'+s;
		}
		x>>=1;
	}
	return s;
}
int dfs(int zt,int op){
	//cout<<"!!! "<<jk(zt)<<"   "<<op<<endl;
	if(op>m){
		return 1;
	}
	if(dp[op][zt]!=minx){
		return dp[op][zt];
	}
	int cnt=0;
	for(int i=n;i>=1;i--){
		if(!a[i]||zt&(1<<(i-1))){
			continue;
		}
		if(i==n){
			//cout<<"!!!!!1   "<<i<<"   "<<jk((zt|(1<<i))|((1<<i)-1));
			//cout<<"   "<<((zt|(1<<i))|((1<<i)-1))<<endl;
			cnt+=dfs((zt|(1<<i))|((1<<i)+1),op);
			cnt+=dfs(zt|(1<<i),op+1);
		}
		else if(i==1){
			//cout<<"!!!!!2   "<<i<<"   "<<jk((zt|(1<<i))|((1<<i)+1));
			//cout<<"   "<<((zt|(1<<i))|((1<<i)+1))<<endl;
			cnt+=dfs((zt|(1<<i))|((1<<i)-1),op);
			cnt+=dfs(zt|(1<<i),op+1);
		}
		else{
			//cout<<"!!!!!3   "<<i<<"   "<<jk((zt|(1<<i))|((1<<i)+1)|((1<<i)-1));
			//cout<<"   "<<((zt|(1<<i))|((1<<i)+1)|((1<<i)-1))<<endl;
			cnt+=dfs((zt|(1<<i))|((1<<i)+1)|((1<<i)-1),op);
			cnt+=dfs(zt|(1<<i),op+1);	
		}
	}
	return dp[op][zt]=cnt;
}
int main(){
	for(int i=0;i<=14;i++){
		for(int j=0;j<=(1<<14);j++){
			dp[i][j]=minx;
		}
	}
	cin>>m>>n;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	cout<<dfs(0,1);
	return 0;
}
2024/12/18 22:11
加载中...