MT2017筆試題

1、大富翁遊戲html

一、題目java

大富翁遊戲,玩家根據骰子的點數決定走的步數,即骰子點數爲1時能夠走一步,點數爲2時能夠走兩步,點數爲n時能夠走n步。求玩家走到第n步(n<=骰子最大點數且是方法的惟一入參)時,總共有多少種投骰子的方法。 python

輸入描述:數組

輸入包括一個整數n,(1 ≤ n ≤ 6)post

輸出描述:url

輸出一個整數,表示投骰子的方法code

輸入例子1:htm

6blog

輸出例子1:遞歸

32

 

二、思路

 遞歸思想: 在走了n步時,投骰子的方法f(n)等於

                    在走了n-1步時投骰子的方法f(n-1)+投一個1

                    在走了n-2步時投骰子的方法f(n-2)+投一個2

                    在走了n-3步時投骰子的方法f(n-3)+投一個3

                        ...

                    在走了1步時投骰子的方法f(1)+投一個n-1

                    直接投n

因此f(n)=f(n-1)+f(n-2)+f(n-3)...+f(1)+1=2^(n-1)

 

三、代碼

import java.util.Scanner;
/*
考察遞歸 f(n)=f(n-1)+f(n-2)+......+f(1)+1
*/

public class daFuWeng {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            int result = method(n);
            System.out.println(result);
        }
        in.close();
    }

    private static int method(int m) {
        int sum = 0;
        if (m == 1) {
            sum = 1;
        } else {
            for(int i=1;i<m;i++){
                sum += method(m-i);
            }
            sum=sum+1;
        }
        return sum;
    }
}

 

2、 拼湊錢幣

一、題目

給你六種面額 一、五、十、20、50、100 元的紙幣,假設每種幣值的數量都足夠多,編寫程序求組成N元(N爲0~10000的非負整數)的不一樣組合的個數。 

 

輸入描述:

輸入包括一個整數n(1 ≤ n ≤ 10000)

 

輸出描述:

輸出一個整數,表示不一樣的組合方案數

 

輸入例子1:

1

 

輸出例子1:

1

 

二、思路 

能夠用動態規劃的方法來求解此問題。動態規劃的基本思想就是將待求解問題分解爲若干子問題,,先求解這些子問題並將結果保存起來,若在求解較大的問題時用到較小子問題的結果,能夠直接取用,從而免去重複計算。

三、代碼  

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int amount = sc.nextInt();// 錢數
            int[] price = {1, 5, 10, 20, 50, 100};// 貨幣面值
            // fun(price, amount);
            fun1(price, amount);
        }
    }

    public static void fun1(int[] price, int amount) {
        long[][] dp = new long[price.length][amount + 1];
        //初始化
        for (int i = 0; i < amount + 1; i++) {
            dp[0][i] = 1;
        }
        for (int i = 0; i < price.length; i++) {
            dp[i][0] = 1;
        }
        //計算
        for (int i = 1; i < price.length; i++) {
            for (int j = 1; j < amount + 1; j++) {
                int m = j / price[i];
                for (int k = 0; k <= m; k++) {
                    dp[i][j] += dp[i - 1][j - k * price[i]];
                }
            }
        }
        //輸出不一樣的組合方案數
        System.out.println(dp[price.length - 1][amount]);
    }
}

  

 

3、最大矩形面積

一、題目

給定一組非負整數組成的數組h,表明一組柱狀圖的高度,其中每一個柱子的寬度都爲1。 在這組柱狀圖中找到能組成的最大矩形的面積(如圖所示)。 入參h爲一個整型數組,表明每一個柱子的高度,返回面積的值。

 

輸入描述:

輸入包括兩行,第一行包含一個整數n(1 ≤ n ≤ 10000)

第二行包括n個整數,表示h數組中的每一個值,h_i(1 ≤ h_i ≤ 1,000,000)

 

輸出描述:

輸出一個整數,表示最大的矩陣面積。

 

輸入例子1:

6

2 1 5 6 2 3

 

輸出例子1:

10

 

 

二、思路 

詳見代碼部分

 

三、 代碼

import java.util.*;
public class theMaxArea{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            //輸入數組長度
            int n = sc.nextInt();
            //輸入數組
            int[] height = new int[n];
            for(int i = 0; i < n; i++){
                height[i] = sc.nextInt();
            }
            int MaxArea = 0; //存儲最大面積
            int minH = 0; //存儲最小高度
            for(int i = 0; i < n; i++){
                minH = height[i];
                for (int j = i; j < n; j++){
                    minH = Math.min(minH, height[j]); //找出i以後的最小高度
                    MaxArea = Math.max(MaxArea, minH * (j - i + 1)); //計算最小高度爲高度的最大面積值
                }
            }

            System.out.println(MaxArea);
        }
        sc.close();
    }
}

  

4、 最長公共連續子串

一、題目

給出兩個字符串(可能包含空格),找出其中最長的公共連續子串,輸出其長度。 

輸入描述:

輸入爲兩行字符串(可能包含空格),長度均小於等於50.

 

輸出描述:

輸出爲一個整數,表示最長公共連續子串的長度。

 

輸入例子1:

abcde

abgde

 

輸出例子1:

2

 

二、思路

 能夠用動態規劃的方法來求解此問題。詳細分析過程見 http://www.cnblogs.com/en-heng/p/3963803.html

三、代碼 

 

import java.util.Scanner;

public class theMaxSubLength {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str1 = sc.nextLine();
            String str2 = sc.nextLine();
            int max = lcs(str1, str2);
            System.out.println(max);
        }
        sc.close();
    }

    public static int lcs(String str1, String str2) {
        int len1 = str1.length();
        int len2 = str2.length();
        int result = 0;     //記錄最長公共子串長度
        int c[][] = new int[len1 + 1][len2 + 1];
        for (int i = 0; i <= len1; i++) {
            for (int j = 0; j <= len2; j++) {
                if (i == 0 || j == 0) {
                    c[i][j] = 0;
                } else if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
                    c[i][j] = c[i - 1][j - 1] + 1;
                    result = Math.max(c[i][j], result);
                } else {
                    c[i][j] = 0;
                }
            }
        }
        return result;
    }
}

 

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

參考連接:

一、【動態規劃】最長公共子序列與最長公共子串

二、牛客網  

相關文章
相關標籤/搜索