#include <iostream>/*记忆化搜索,h[0]=0,那么h[1]=1(原因见dfs函数部分),可依次递归递推求出h[n] */
#include <cstdio>
using namespace std;
int h[1001];//记忆化搜索的记忆区
void dfs(int m)//记忆化搜索函数主体
{
int i;
if(h[m]!=-1)return;/*如果h[m]的值已知,即记忆区已存在其可能个数,
那么直接引用即可,无须二次计算 */
h[m]=1; //表示m本身的一种情况,如3的{3}这一种情况
for(i=1;i<=m/2;++i){
dfs(i);
h[m]+=h[i]; //递归搜索h[i]的值,递推求h[m]的值
}
}
int main(){
int n;//输入的自然数
cin>>n;
for(int i=1;i<=n;++i){
h[i]=-1; //将h[1~n]全部赋值为-1,便于进行记忆化搜索
}
dfs(n); //找寻n的值,进行记忆化搜索
cout<<h[n]; //输出
return 0;
}
原创注释……
实在没思路
个人观点:这题不错,可能是我太弱了吧……