一、上台阶问题,一次要么上一个要么上两个,那么去第n个台阶总共有多少种不同的方法?
dp[i] 去第i个台阶时共有多少种方法
状态转移方程:dp[i] = dp[i - 1] + dp[i - 2]
public int climbStairs01(int n){
//递归
return climb_Stairs(0,n);
}
public int climb_Stairs(int i, int n) {
if(i>n)
return 0;
if(i==n)
return 1;
return climb_Stairs(i+1,n)+climb_Stairs(i+2,n);
}
public int climbStairs02(int n){
if(n==1)
return 1;
int[] dp=new int[n+1];
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;i++)
dp[i]=dp[i-1]+dp[i-2];
return dp[n];
}
二、你是一个专业的强盗,计划在街上抢房。 每个房子都有一定数量的钱,唯一的限制是阻止你们抢劫每一个房屋,相邻的房屋有安全系统连接,如果两个相邻的房屋在同一天晚上被打破,它会自动联系警察。给出一个表示每个房子的金额的非负整数的列表,确定你今天晚上可以抢救的最大金额,而不提醒警察。
dp[i][1] 意味着我们抢现在的这个房子,dp[i][0] 意味着不抢,i代表第i个状态转移方程:
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
dp[i][1] = num[i - 1] + dp[i - 1][0];
public class dp05 {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public int rob(int[] num) {
int[][] dp = new int[num.length + 1][2];
for (int i = 1; i <= num.length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
dp[i][1] = num[i - 1] + dp[i - 1][0];
}
return Math.max(dp[num.length][0], dp[num.length][1]);
}
}
三、输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值
//dp[i]:以下标i结束的连续数组最大和
//状态转移方程:dp[i]=dp[i-1]+arr[i] (dp[i-1]>0) dp[i]=arr[i] (dp[i-1]<=0)
//最终结果:max(dp)
public int FindGreatestSumOfSubArray(int[] array) {
int len=array.length;
int[] dp=new int[len];
dp[0]=array[0];
for(int i=1;i<len;i++){
if(dp[i-1]>0)
dp[i]=dp[i-1]+array[i];
else
dp[i]=array[i];
}
int max=dp[0];
for(int i=1;i<len;i++)
if(dp[i]>max)
max=dp[i];
return max;
}