dp(1)

一、上台阶问题,一次要么上一个要么上两个,那么去第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;
	    }

  

  

   



   


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值