经典记忆化搜索
来源:互联网 发布:java用户管理系统代码 编辑:程序博客网 时间:2024/06/03 20:07
问题
We all love recursion! Don’t we?
Consider a three-parameter recursive function w(a, b, c):
if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 1
if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: w(20, 20, 20)
if a < b and b < c, then w(a, b, c) returns:
w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
otherwise it returns:
w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
This is an easy function to implement. The problem is, if implemented directly, for moderate values of a, b and c (for example, a = 15, b = 15, c = 15), the program takes hours to run because of the massive recursion.
Input
The input for your program will be a series of integer triples, one per line, until the end-of-file flag of -1 -1 -1. Using the above technique, you are to calculate w(a, b, c) efficiently and print the result.
Output
Print the value for w(a,b,c) for each triple.
Sample Input
1 1 1
2 2 2
10 4 6
50 50 50
-1 7 18
-1 -1 -1
Sample Output
w(1, 1, 1) = 2
w(2, 2, 2) = 4
w(10, 4, 6) = 523
w(50, 50, 50) = 1048576
w(-1, 7, 18) = 1
题解
直接递归肯定会超时,我们要结合记忆化特点,才有dp操作,防止重复操作,用空间换取时间。时间复杂度O(n^3)。
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;typedef long long LL;#define ms(a, b) memset(a, b, sizeof(a))int dp[57][57][57];int dfs(int a,int b,int c){ if(a<=0 ||b<=0 ||c<=0) return 1; if(a>20 ||b>20 ||c>20) return dfs(20,20,20); if(dp[a][b][c]) return dp[a][b][c]; if(a<b && b<c) dp[a][b][c]=dfs(a,b,c-1)+dfs(a,b-1,c-1)-dfs(a,b-1,c); else dp[a][b][c]=dfs(a-1,b,c)+dfs(a-1,b-1,c)+dfs(a-1,b,c-1)-dfs(a-1,b-1,c-1); return dp[a][b][c];}int main(){ int a,b,c; while(~scanf("%d%d%d",&a,&b,&c)){ if(a==-1&&b==-1&&c==-1){break;} int ans=dfs(a,b,c); printf("w(%d, %d, %d) = %d\n",a,b,c,ans); } return 0;}
- 经典记忆化搜索
- poj 1088 经典的记忆化搜索
- 记忆化搜索:POJ1088-滑雪(经典的记忆化搜索)
- POJ--1191[棋盘分割] 经典的记忆化搜索
- poj--1579--(DFS+记忆化搜索之经典)
- poj--1088--DFS(记忆化搜索之经典)
- POJ 1088: 滑雪(经典 DP+记忆化搜索)
- UVa 10118 Free Candies(记忆化搜索经典)
- dp经典矩阵连乘-记忆化搜索实现
- hdu 1078 FatMouse and Cheese【经典记忆化搜索】
- UVA - 10118 Free Candies 记忆化搜索经典
- POJ1088 滑雪 经典DP 记忆化搜索和递推
- 记忆化搜索例题
- PKU1088---记忆化搜索
- PKU1088 记忆化搜索
- HDU1078 记忆化搜索
- HDU1501 记忆化搜索
- HDU1978 记忆化搜索
- 问题:如果鸟是可以飞的,那鸵鸟是鸟吗?鸵鸟该如何继承鸟类
- cprintf与printf的区别
- 水果盛宴
- 第二章 SQL命令参考-ALTER AGGREGATE
- 关于常见的Java面试,你应该准备这些知识点
- 经典记忆化搜索
- 南阳OJ 会场安排问题 (贪心)
- java经典笔试题目解析(上)
- ArrayAdapter requires the resource ID to be a TextView错误
- 【Halcon教程1】 【halcon相关学习教程和资料的链接】
- Flask获取请求参数
- 基于pinpoint改造的一种方式的思考(3)--javascript/golang agent处理
- 编码器
- 【Halcon教程2】halcon/c++接口基础 之 halcon初认识