杭电oj_2047——阿牛的EOF牛肉串(java实现)

Posted 醉生梦死_0423

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杭电oj_2047——阿牛的EOF牛肉串(java实现)相关的知识,希望对你有一定的参考价值。

//20200322update

最近在重新把hdoj11页做一遍,发现递推还是有些模糊,就重新来更新下,新增一题2045

首先是2045题(RPG问题)

思路:分两种情况

1. 第n-1个元素和第一个元素同色,则第n-2个元素和第一个元素肯定不同色(因为之前的序列都是合法的),那么最后一个元素有两种选法,则这种情况的数量为2*f(n-2)

2. 第n-1个元素和第一个元素不同色,则最后一个格子只有一种选法,故这种情况数量为f(n-1)

故所有情况为二者之和

 

source code:

package hduoj;

import java.util.Scanner;

public class hdoj_2045 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long[] res = new long[51];
        res[1] = 3;
        res[2] = 6;
        res[3] = 6;//注意第三个要单独列出,因为有三个元素的话,倒数第二个元素不可能和首元素相同
        for(int i = 4;i<51;++i){
            res[i] = res[i-1] + 2 * res[i-2];
        }

        while(sc.hasNext()){
            System.out.println(res[sc.nextInt()]);
        }
    }
}

 

接下来是2047题

这一题看了下我原来的博客,使用的找规律的方法,画出分支树然后找规律,这样比较难懂

所以换了一种做法,比上一种更好懂

 

思路:

也是分为两种情况

1. 最后一个元素是‘o’的字符串

2. 最后一个元素不是‘o’的字符串

创建一个n行2列的二维数组,将第一种情况的数量存在第一列,第二种存在第二列

则第n行的情况为

1. 最后一个元素为‘o’的字符串数量为n-1行第二列的数值(因为不能有两个‘o’连在一起)

2. 最后一个元素不是‘o’的字符串数量为两倍的n-1行所有数据的和(因为无论是哪种情况后面都可以加非‘o’字母,切有两种选法)

 

source code

import java.util.Scanner;
/**


*/
public class Main{

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); 
        long[][] dp = new long[40][2];
        dp[0][0] = 1;
        dp[0][1] = 2;
        for(int i = 1;i<40;++i){
            dp[i][0] = dp[i-1][1];
            dp[i][1] = 2*(dp[i-1][1] + dp[i-1][0]);
        }
        
        while(sc.hasNext()){

            int i = sc.nextInt();
            System.out.println(dp[i-1][0] + dp[i-1][1]);
        }
        
    }


    

    
}

 

---------------------------------------------------------------------

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2047

思路:先是列出了四个,但是没发现规律,然后开始画递归树,在其中找到了规律,算出递归式为f(n) = 2*[f(n-1)+f(n-2)]

递归树分析如下(有点潦草,看不懂可以留言,大致模型为嵌套):

 

 

source code:

package hduoj;

import java.util.Scanner;

public class hdoj_2047 {
    /**
     * 得出递归式:f(n) = 2*[f(n-1)+f(n-2)]
     */
    public static void main(String[] args) {
        long[] data = new long[41];
        data[1] = 3;
        data[2] = 8;
        for(int  i = 3;i<41;++i){
            data[i] = 2*(data[i - 1]+data[i - 2]);
        }
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            System.out.println(data[sc.nextInt()]);
        }
    }
}

 

代码已经ac

希望对大家有所帮助

以上

以上是关于杭电oj_2047——阿牛的EOF牛肉串(java实现)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2047 阿牛的EOF牛肉串 (递推)

HDOJ_2047_阿牛的EOF牛肉串

HDU 2047 阿牛的EOF牛肉串

HDU 2047 阿牛的EOF牛肉串

阿牛的EOF牛肉串-记忆化搜索或动态规划

hdu2047