【题目一】大富翁游戏
大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步。求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。
【输入】一个整数n,(1<=n<=6)
【输出】输出一个整数,表示投骰子的方法。
【示例】输入6,输出32.
【思路】
n=1时,num = 1 (2的0次幂)
n=2时,num = 2 即可以从n=1多走一步,或者直接n=2 (2的1次幂)
n=3时,num = 4 可以从n=1多2,或者n=2多1,或者n=3,为1+2+1 = 4种 (2的2次幂)
同理 num[n] = num[1]+num[2]+……+num[n-1]+1 = 2的n-1次幂。
import java.util.Scanner;
public class bigWealth {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int n = input.nextInt();
System.out.println(methodsNum(n));
}
public static int methodsNum(int n)
{
if(n>6 || n<=0)
return -1;
else
return (int)Math.pow(2, n-1);
}
}
给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。
【输入】一个整数n(1 ≤ n ≤ 10000)
【输出】一个整数,表示不同的组合方案数
import java.util.Scanner;
public class Main {
public static void main(String args[]){
Scanner input=new Scanner(System.in);
while(input.hasNext())
{
int n=input.nextInt();
long res=count(n);
System.out.println(res);
}
}
public static long count(int n){
int coins[]={1,5,10,20,50,100};
int len=coins.length;
//dp[i][j]的含义是使用coins[0……i]货币情况下,组成钱数j的方法数。
long dp[][]=new long[len][n+1];
//使用任意种货币组成0元的情况都有1种。
for(int i=0;i<len;i++)
dp[i][0] = 1;
//钱数为第一种货币的倍数时,均有一种仅使用第一种货币就拼凑出钱数的方法。
for(int j=1;coins[0]*j<=n;j++)
dp[0][coins[0]*j]=1;
for(int i=1;i<len;i++){
for(int j=1;j<=n;j++)
{
for(int k=0;k*coins[i]<=j;k++)
dp[i][j]+=dp[i-1][j-k*coins[i]];
}
}
return dp[len-1][n];
}
}
【题目三】最大矩形面积
给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
【示例】
【输入】: 6
2 1 5 6 2 3
【输出】:10
暴力法…
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int []array = new int[n];
for(int i=0;i<n;i++)
array[i] = input.nextInt();
System.out.println(getMaxArea(array));
}
public static int getMaxArea(int []array)
{
int len = array.length;
int maxArea = 0;
for(int i=0;i<len;i++)
{
int width = 1; //记录此时宽度为1
int height = array[i]; //记录此时高度为array[i]
int area = height*width; //记录初始面积
int max = area;
for(int j=i+1;j<len;j++)
{
width++;
height = Math.min(height, array[j]);
area = height*width;
max = max>=area?max:area;
}
maxArea = maxArea>max?maxArea:max;
}
return maxArea;
}
}
【题目四】最长公共连续子串
给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。
【示例】
【输入】
abcde
abgde
【输出】
2
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
String str1 = input.nextLine();
String str2 = input.nextLine();
System.out.println(getLongestSameStr(str1,str2));
}
public static int getLongestSameStr(String str1,String str2)
{
int max = 0;
if(str1.length()==0 || str2.length()==0)
{
return 0;
}
else
{
//生成动态规划表,dp[i][j]表示把str1[i]和str2[j]当做公共子串的最后一个字符的情况下,公共子串的长度。
int [][]dp = new int[str1.length()][str2.length()];
//str1的任意位字符等于str2的第一位字符,那么dp[i][0]相应位置置1。
for(int i=0;i<str1.length();i++)
if(str1.charAt(i) == str2.charAt(0))
dp[i][0] = 1;
//str2的任意位字符等于str1的第一位字符,那么dp[0][j]相应位置置1。
for(int j=1;j<str2.length();j++)
if(str2.charAt(j) == str1.charAt(0))
dp[0][j] = 1;
//str1的任意位字符等于str2的任意位字符,那么dp[i][j] = dp[i-1][j-1] + 1。
for(int i=1;i<str1.length();i++)
for(int j=1;j<str2.length();j++)
if(str1.charAt(i) == str2.charAt(j))
dp[i][j] = dp[i-1][j-1] + 1;
for(int i=0;i<str1.length();i++)
for(int j=0;j<str2.length();j++)
max = max>dp[i][j]?max:dp[i][j];
return max;
}
}
}
DP大法好啊…要努力补课了~
keep moving……