zoukankan      html  css  js  c++  java
  • POJ 1579 Function Run Fun 【记忆化搜索入门】

    题目传送门: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: 


    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:

     1 /// POJ 1579 记忆化搜索入门
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <cstring>
     6 #include <cmath>
     7 #define ll long long int
     8 #define INF 0x3f3f3f3f
     9 using namespace std;
    10 
    11 const int MAXN = 23;
    12 int d[MAXN][MAXN][MAXN];
    13 
    14 int dfs(int a, int b, int c)
    15 {
    16     if(a <= 0 || b <= 0 || c <= 0) return 1;
    17     if(a > 20 || b > 20 || c > 20) return dfs(20, 20, 20);
    18     if(d[a][b][c]) return d[a][b][c];
    19     if(a < b && b < c) d[a][b][c] = dfs(a, b, c-1)+dfs(a, b-1, c-1) - dfs(a, b-1, c);
    20     else d[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);
    21     return d[a][b][c];
    22 }
    23 int main()
    24 {
    25     int ans, A, B, C;
    26     memset(d, 0, sizeof(d));
    27     while(~scanf("%d%d%d", &A, &B, &C))
    28     {
    29         if(A == -1 && B == -1 && C == -1) break;
    30         ans = dfs(A, B, C);
    31         printf("w(%d, %d, %d) = %d
    ", A, B, C, ans);
    32     }
    33     return 0;
    34 }
  • 相关阅读:
    ServiceStack支持跨域提交
    CookiesHelper
    poj 3669 线段树成段更新+区间合并
    poj2528 线段树+离散化
    hdu3308 线段树 区间合并
    hdu1542矩阵的并 线段树+扫描线
    hdu1255 矩阵的交 线段树+扫描线
    简单单点更新线段树
    树状数组模版
    hdu1873优先队列
  • 原文地址:https://www.cnblogs.com/ymzjj/p/9495426.html
Copyright © 2011-2022 走看看