题目传送门:http://poj.org/problem?id=1579

Function Run Fun

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 20560   Accepted: 10325

Description

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

Source

题意概括:

要求写一个函数 w( a, b, c) 处理输入数据(多测试);

①如果 a < 0 || b < 0 || c < 0;直接返回w( a, b, c );

②如果 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) ;

解题思路:

记忆化搜索裸题。

AC code:

 /// POJ 1579 记忆化搜索入门
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define ll long long int
#define INF 0x3f3f3f3f
using namespace std; const int MAXN = ;
int d[MAXN][MAXN][MAXN]; int dfs(int a, int b, int c)
{
if(a <= || b <= || c <= ) return ;
if(a > || b > || c > ) return dfs(, , );
if(d[a][b][c]) return d[a][b][c];
if(a < b && b < c) d[a][b][c] = dfs(a, b, c-)+dfs(a, b-, c-) - dfs(a, b-, c);
else d[a][b][c] = dfs(a-, b, c)+dfs(a-, b-, c)+dfs(a-, b, c-)-dfs(a-,b-,c-);
return d[a][b][c];
}
int main()
{
int ans, A, B, C;
memset(d, , sizeof(d));
while(~scanf("%d%d%d", &A, &B, &C))
{
if(A == - && B == - && C == -) break;
ans = dfs(A, B, C);
printf("w(%d, %d, %d) = %d\n", A, B, C, ans);
}
return ;
}

最新文章

  1. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager
  2. OpenStack Mitaka 版本中的 domain 和 admin
  3. 关于SQL Cookbook里dept与emp表结构以及数据
  4. 在WCF数据访问中使用缓存提高Winform字段中文显示速度
  5. datagridview的数据存取
  6. State(状态)
  7. How to Build Office Developer Tools Projects with TFS Team Build 2012
  8. 针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
  9. Research on Unsupervised Word Alignment Based on Inversion Transduction Grammar
  10. 高版本myeclipse破解以及优化
  11. Linux时间同步方式记录
  12. 【转】iOS- 详解文本属性Attributes
  13. webpack-react之webpack篇(http://www.jianshu.com/p/794d573d2c53)
  14. HashMap 和 HashTable 区别
  15. STL:map/multimap用法详解
  16. Leetcode 226. Invert Binary Tree(easy)
  17. 必须知道的Spring Boot中的一些Controller注解
  18. 《转》Pragma: no-cache 对性能的影响
  19. redis 性能建议
  20. ubuntu 终端无法启动:ImportError: cannot import name &#39;sysconfig&#39; from &#39;distutils&#39;

热门文章

  1. 在Spark shell中基于Alluxio进行wordcount交互式分析
  2. 【ORACLE】sqlplus使用记录
  3. 安卓获取输入法高度与ViewTreeObserver讲解
  4. c#合并字典
  5. Django自定义登陆验证后台
  6. JAVA 利用反射自定义数据层框架
  7. 数据库和AI的一次火花
  8. OpenLayers 案例一
  9. ICONIX
  10. 1、v1 与 v2的比较