zoukankan      html  css  js  c++  java
  • HDU 2045 不容易系列之(3)—— LELE的RPG难题(递归/动态规划)

    不容易系列之(3)—— LELE的RPG难题

    Problem Description
    人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研究起了著名的RPG难题:

    有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.

    以上就是著名的RPG难题.

    如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?

     
    Input
    输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50)。
     
    Output
    对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
     
    Sample Input
    1 2
     
    Sample Output
    3 6
     
    Answer 1
    递归公式是f(n) = f(n-1) + 2*f(n-2)。直接递归是TLE的,需要记忆化。还有数组要用long long。
     
    #include <cstdio>
    #include <iostream>
    using namespace std;
    int n;
    long long a[60]={0,3,6,6};
    long long f(int n)
    {
        if(n<=3)return a[n];
        if(a[n]==0)a[n]=f(n-1)+2*f(n-2);
        return a[n];
    }
    int main()
    {
        while(cin>>n)
        {printf("%I64d
    ",f(n));}
        return 0;
    }
    View Code
    Answer 2
    转化为DP,公式是一样的。只是不用函数递归而已...其实就是把数组名改成了dp。=_=
     
    #include <cstdio>
    #include <iostream>
    using namespace std;
    int n,i;
    long long dp[60]= {0,3,6,6};
    int main()
    {
        ios::sync_with_stdio(false);
        for(i=4; i<51; i++)//预处理先算出所有答案,也可以读取一个算一个
            dp[i]=dp[i-1]+dp[i-2]*2;//不保存可能会超时,边读边算效率要看数据量
        while(cin>>i)
            printf("%I64d
    ",dp[i]);
        return 0;
    }
    View Code
  • 相关阅读:
    并不对劲的网络流
    并不对劲的[noi2006]网络收费
    并不对劲的spoj1812
    48.孩子们的游戏(圆圈中最后剩下的数)
    47.扑克牌顺子
    46.翻转单词顺序
    45.左旋转字符串
    44.和为S的两个数字
    43.和为S的连续正数序列
    42.数组中只出现一次的数字
  • 原文地址:https://www.cnblogs.com/gpsx/p/5222286.html
Copyright © 2011-2022 走看看