求大佬帮助
  • 板块学术版
  • 楼主_Deer_Peach_
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/29 22:20
  • 上次更新2023/11/30 12:56:22
查看原帖
求大佬帮助
1040109
_Deer_Peach_楼主2023/11/29 22:20
题目描述:
Maoge有N个砖块 (2<=N<=1000), 他想要把这些砖块搭成一个塔。如果他把砖块A放在B上面,A的长度必须小于等于B的长度减去D (1<=D<=n)。请找出一共有有多少种方法,然后输出答案 mod 10^9+7。
塔的高度不能为零。

输入格式:
第一行两个整数N和D。

第二行N个整数,代表砖块的长度。

输出格式:
答案 modulo 10^9+7.

样例输入:
4 1
1 2 3 100
样例输出:
15
#include<bits/stdc++.h>
using namespace std;
int n,a[1005],vis[1005],d,ans=0;
const int N=1e9+7;
void dfs(int x,int y,int step){// x是最顶层砖块的长度,y是层数,step是当前层数 
	if(step==y){//当前层数=y,ans+1 
		ans++;
		ans%=N;
		return ;
	}
	for(int i=1;i<=n;i++){	//枚举下一层	
		if(vis[i]==0){
			if(a[i]>x-d) break;//剪枝 (当目前砖块不满足条件,那么之后的砖块都不符合条件,直接结束) 
		 	vis[i]=1;//标记 
			dfs(a[i],y,step+1);
			vis[i]=0;//撤销标记 
		}
	}
	ans++;
}
int main(){
	cin>>n>>d;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	memset(vis,0,sizeof(vis));
	sort(a+1,a+n+1);//a数组从小到大排序 
	for(int i=1;i<=n;i++){//枚举层数 
		for(int j=n;j>=1;j--){//从大到小枚举最底层的砖块 
			vis[j]=1;//标记最顶层砖块 
			dfs(a[j],i,1);//搜索 
		}	
	} 
	cout<<ans;
	return 0;
}
2023/11/29 22:20
加载中...