首先这道题的标签是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;
}