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; } }
-------------------------------
參考連接:
二、牛客網