【P1028 数的计算】递归+记忆化搜索优化(白234页4.6)
本题递归解法25分,递归+记忆化搜索解法(100分)
(1)递归解法
#include<iostream> using namespace std; int ans; void dfs(int m) { int i; ans++; for(i=1;i<=m/2;i++) dfs(i); //不超过自己的一半不断的调用自己 } int main() { int n; cin>>n; dfs(n); cout<<ans; return 0; }
(2)dsf+数组记忆化搜索,100分AC【每次存储中间过程,避免重复调用——妙!】
#include<iostream> using namespace std; int h[1001]; void dfs(int m) { int i; if(h[m]!=-1) return; h[m]=1; for(i=1;i<=m/2;i++) { dfs(i); h[m]=h[m]+h[i]; //中间过程被暂存 是关键 } } int main() { int n,m; cin>>n; for(int i=1;i<=n;i++) h[i]=-1;//标记过程全设为-1 dfs(n); cout<<h[n]; return 0; }