这个题怎么做啊
查看原帖
这个题怎么做啊
1135901
Programming_Konjac楼主2024/1/23 22:09

我的代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
ll qpow(ll a,ll b){
	ll sum=1;
	while(b){
		if(b&1) sum=(sum*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return sum%mod;
}
bool is_beatiful_array(int n,int m,int array_a[],int array_b[]){
	for(int i=1; i<=m; i++){
		for(int j=1; j<=n; j++){
			if(array_b[j]==array_a[i]){
				int flag=0;
				for(int k=j+1; k<=min(n,j+array_a[i]-1); k++){
					if(array_b[k]==array_a[i]){
						return false;
					}
				}
			}
		}
	}
	return true;
}
int cnt=0;
void dfs(int deep,int n,int m,int b[],int a[105]){
	if(deep==n+1){
		int k=is_beatiful_array(n,m,b,a);
		if(k==1){
			/*debug......
			for(int i=1; i<=n; i++){
				cout<<a[i]<<" ";
			}
			cout<<endl;*/
			cnt=(cnt+1)%mod;
		}
		return;
	}
	for(int i=1; i<=m; i++){
		int j=a[deep];
		a[deep]=b[i];
		dfs(deep+1,n,m,b,a);
		a[deep]=j;
	}
	return;
}
int main(){
	int n,m;
	cin>>n>>m;
	int a[10],b[105]={0};
	for(int i=1; i<=m; i++){
		cin>>a[i];
	}
	if(m==1) cout<<1<<endl;
	else if(n==1) cout<<m<<endl;
	else{
		dfs(1,n,m,a,b);
		cout<<cnt<<endl;
	}
	return 0;
}

怎么改啊,怎么剪枝优化

2024/1/23 22:09
加载中...