lowbit优化状压dp,想问下两份代码的区别
查看原帖
lowbit优化状压dp,想问下两份代码的区别
421265
eastcloud楼主2022/6/17 13:37

rt,两份代码一份70 WA#1#6#7,一份100,AC的我把dp[i<<i]的部分放到里面一起计算了,WA的提前进行了预处理,感觉没有什么区别啊。

AC代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#define mod 1000000007
#define ll long long
using namespace std;
int num[30];
int dp[(1<<24)];
int val[(1<<24)];
int main(){
	int n,a=0,b=0,m;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>val[(1<<(i-1))];
	cin>>m;
	if(m==1) cin>>a;
	else if(m==2) cin>>a>>b;
	dp[0]=1;
	for(int i=0;i<(1<<n);i++){
		if(i==0) continue;
		int tmp=i,x,flag=0;
		while(tmp){
			x=(tmp&(-tmp));
			if(!flag){
				val[i]=val[i-x]+val[x];
				if(val[i]==a || val[i]==b) break;
				flag^=1;
			}
			dp[i]=(dp[i]+dp[i-x])%mod;
			tmp-=x;
		}
	}
	cout<<dp[(1<<n)-1];
}

WA代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#define mod 1000000007
#define ll long long
using namespace std;
int num[30];
int dp[(1<<24)];
int val[(1<<24)];
int main(){
	int n,a=0,b=0,m;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>num[i];
	cin>>m;
	if(m==1) cin>>a;
	else if(m==2) cin>>a>>b;
	for(int i=0;i<n;i++){
		if((1<<i)!=a && (1<<i)!=b) dp[(1<<i)]=1;
		val[(1<<i)]=num[i+1];
	}
	for(int i=0;i<(1<<n);i++){
		if(i==0 || i-(i&(-i))==0) continue;
		int tmp=i,x,flag=0;
		while(tmp){
			x=(tmp&(-tmp));
			if(!flag){
				val[i]=val[i-x]+val[x];
				if(val[i]==a || val[i]==b) break;
				flag^=1;
			}
			dp[i]=(dp[i]+dp[i-x])%mod;
			tmp-=x;
		}
	}
	cout<<dp[(1<<n)-1];
}
2022/6/17 13:37
加载中...