原题:USCOJ(Ov<)\
首先我的思路是全部遍历一遍,
#include<bits/stdc++.h>
using namespace std;
#define lint long long
int n,h;
lint ans=0;
int solve(int x,int c){
for(int i=x;i<=n;i++){
if(c==h) {ans++; }
if (c!=h) solve(i,c+1);
}
return 0;
}
int main(){
cin >> n >> h;
solve(1,1);
cout << ans;
return 0;
}
不过超时了
然后我想用记忆化搜索可以优化不必要的搜索
a数组用来储存节点的方案数
#include<bits/stdc++.h>
using namespace std;
#define lint long long
lint n,h,a[100][100];
lint dp(int c,int i){
if(a[c][i]) return a[c][i];
if(c==h) {a[c][i]=1; return 1;}
for(int j=i;j<=n;j++)
a[c][i]+=dp(c+1,j);
return a[c][i];
}
int main(){
cin >> n >> h;
memset(a,0,sizeof(a));
dp(0,1);
cout << a[0][1];
return 0;
}