zoukankan      html  css  js  c++  java
  • poj

    Function Run Fun
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 18338   Accepted: 9372

    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

    这道题没有给数据的范围,我没有考虑dp,然后就当做数学题来做,就发现里一组规律,如果x<=y<=z,那么答案一定是 1<<x。但是仍然TEL。百度后才知道数据的范围,dp就好了。

    #include <map>
    #include <set>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <iostream>
    #include <stack>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <cstdlib>
    //#include <bits/stdc++.h>
    //#define LOACL
    #define space " "
    using namespace std;
    typedef long long LL;
    //typedef __int64 Int;
    typedef pair<int, int> paii;
    const int INF = 0x3f3f3f3f;
    const double ESP = 1e-5;
    const double Pi = acos(-1.0);
    const int MOD = 1e9 + 7;
    const int MAXN = 10000 + 100;
    int dp[100][100][100];
    LL solve(LL a, LL b, LL c) {
        if(a <= 0 || b <= 0 || c <= 0)  return 1;
        if(a > 20 || b > 20 || c > 20)  return solve(20, 20, 20);
        if(dp[a][b][c]) return dp[a][b][c];
        if(a <= b && b <= c)  dp[a][b][c] = 1<<a;
        else  dp[a][b][c] = solve(a - 1, b, c) + solve(a-1, b-1, c) + solve(a-1, b, c-1) - solve(a-1, b-1, c-1);
        return dp[a][b][c];
    }
    int main() {
        LL a, b, c;
        while (scanf("%lld%lld%lld", &a, &b, &c) != EOF) {
            if (a == -1 && b == -1 && c == -1) break;
            printf("w(%lld, %lld, %lld) = %lld
    ", a, b, c, solve(a, b, c));
        }
        return 0;
    }



  • 相关阅读:
    mysql索引创建&查看&删除
    linq中不能准确按拼音排序
    Vue的组件的注册,复用以及组件中template多行处理
    Vue的简单使用和部分常用指令
    SpringBootMVC+thymeleaf模板初探
    记一次遗留代码的重构改造:数十万行国家标准坐标文件分析方法的改造与提速
    springBoot 集成Mysql数据库
    C#和Java的对比
    架构学习提炼笔记(三):高性能架构设计技巧——读写分离
    架构学习提炼笔记(二):架构设计的流程是什么?
  • 原文地址:https://www.cnblogs.com/cniwoq/p/6770772.html
Copyright © 2011-2022 走看看