【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;

}

 

posted on 2018-11-28 08:28  lcdxjsj  阅读(111)  评论(0编辑  收藏  举报

导航