记忆化搜索

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

特点:全局最优

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

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

 

posted @ 2019-07-07 10:13  SUHANG苏航  阅读(836)  评论(0编辑  收藏  举报