蒟蒻的一篇复健题解
查看原帖
蒟蒻的一篇复健题解
1459554
ZAYYY楼主2025/7/2 21:58

首先这道题的标签是DP和递归,不过可以忽略递归,毕竟要DP的题肯定要递归基本上


首先我们来看一下这道题的题意,题意很好懂有脑子都能看得懂就是找队列嘛,那我们如何去找就成了一个问题,其实稍微分析一下可以发现比如样例,一个数n包含所有下一位是小于n/2的所有情况对吧,所以我们可以得出以下代码结论

a[x]=1;
		for (int i=1;i<=x/2;i++){
			a[x]+=a[i];
		}

那我们可以算出来a[n]的值,a[n]的值不就是最终的答案嘛,但我们要去算出a[n],所以这里本蒟蒻采用了递归的方式如下

int dg(int x){
	if (x==n){
		a[x]=1;
		for (int i=1;i<=x/2;i++){
			a[x]+=a[i];
		}
		return a[x];
	}
	else{
		a[x]=1;
		for (int i=1;i<=x/2;i++){
			a[x]+=a[i];
		}
		return dg(x+1);
	}
}

通过递归的方式去得到a[n]的值,AC的代码如下

#include<bits/stdc++.h>
using namespace std;
int a[1010];
int n;
int dg(int x){
	if (x==n){
		a[x]=1;
		for (int i=1;i<=x/2;i++){
			a[x]+=a[i];
		}
		return a[x];
	}
	else{
		a[x]=1;
		for (int i=1;i<=x/2;i++){
			a[x]+=a[i];
		}
		return dg(x+1);
	}
}
int main(){
	cin>>n;
	a[1]=1;
	if(n==1){
		cout<<1;
		return 0;
	}
	int ans=dg(2);
	cout<<ans;
} 
2025/7/2 21:58
加载中...