简单状压 dp 有没有佬帮忙卡个常 qwq
查看原帖
简单状压 dp 有没有佬帮忙卡个常 qwq
511609
无钩七不改名楼主2023/6/2 12:22

rt.

https://www.luogu.com.cn/record/111794819

#include<bits/stdc++.h>
using namespace std;

int n,m;
int m1=-1,m2=-1;
long long a[1<<24],dp[1<<24],mod=1e9+7;

int main(){
	scanf("%d",&n);
	for(int i(0);i<n;i++)scanf("%d",a+(1<<i));
	scanf("%d",&m);
	if(m)scanf("%d",&m1);
	if(m>1)scanf("%d",&m2);
	if(!m1||!m2)return puts("0"),0;
	dp[0]=1;
	int msk=(1<<n);
	for(int i(1);i<msk;i++){
		int k(i),j(i&-i);
		a[i]=a[i^j]+a[j];
		if(a[i]==m1||a[i]==m2)continue;
		for(;k;k^=j,j=(k&-k))
			dp[i]=(dp[i]+dp[i^j])%mod;
	}
	printf("%lld",dp[msk-1]);
	return 0;
}

感觉思路跟第一份题解差不多啊,但是不知道为什么慢这么多 qwq

thx.

2023/6/2 12:22
加载中...