记忆化搜索

记忆化搜索:(记忆化搜索=搜索形式+动态规划

特点:全局最优

一定会用一个数组或其他存储结构存储之前得到的子问题的解(空间换时间)

1、适用范围:必须是分步计算,且搜索过程中的一个搜索的结果必须建立在同类型问题的基础上

2、思想:根据动态规划方程写出递归式,下函数的开头直接返回以前计算过的结果(需要一个存储结构来记录之前算过的结果)

3、核心实现:

a.要通过一个表记录已经存储下的搜索结果(二维数组或哈希表)

b.状态表示,若用数组表示,数组的下标表示每种状态

c.在每一状态搜索的开始,高效的使用数组(或哈希表)搜索这个状态是否出现过,如果已经做过,直接调用答案,回溯

d.如果没有,则按正常方法搜索 (搜索过程中不断记录搜索结果)

题例:

洛谷平台P1464:Function

【问题描述】
自定义函数w(a,b,c)。
如果 a ≤ 0 或b ≤ 0 或 c ≤ 0, 则返回结果: 1;
如果 a > 20 或 b > 20 或 c > 20, 则返回结果:  w(20, 20, 20);
如果 a < b 且 b < c, 则返回结果:   w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
否则返回结果:  w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
 
【输入格式】
输入包含若干个测试数据,每个测试数据一行,分别表示a,b和c的值。
输入以-1 -1 -1表示结束。
 
【输出格式】
若干行,每行依次输出一个测试数据对应的函数的返回结果。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 long long  x,y,z;
 4 
 5 long long fun[50][50][50];
 6 int w(long long  a,long long b,long long c)
 7 {
 8     if(a>=0 && a<=20 && b>=0 && b<=20 && c>=0 && c<=20)
 9        if  (fun[a][b][c]!=0) return fun[a][b][c];//***
10        
11       if(a<=0||b<=0||c<=0){
12             if(a>=0 && a<=20 && b>=0 && b<=20 && c>=0 && c<=20)
13             return fun[a][b][c]=1;
14             else return 1;
15             }
16             
17     else if(a>20 || b>20 || c>20)
18         return fun[20][20][20]=w(20,20,20);
19         
20     else if(x<y && y<z){
21          if(a>=0 && a<=20 && b>=0 && b<=20 && c>=0 && c<=20)
22               return fun[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
23          else return  w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
24          }
25          
26     else if(a>=0 && a<=20 && b>=0 && b<=20 && c>=0 && c<=20)
27             return fun[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
28          else return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
29 }
30 int main()
31 {
32 
33     while(1)
34     {   scanf("%lld %lld %lld",&x,&y,&z);
35         if(x==-1 && y==-1 && z==-1) break;
36         printf("w(%lld,%lld,%lld)=%lld\n",x,y,z,w(x,y,z));
37     }
38     return 0;
39 }
Function

 

转载于:https://www.cnblogs.com/SUHANG12138/p/11145201.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值