假设你是一个劫匪 抢劫一条街上的房子 每个房子里有一定数目的钱 但是如果抢劫相连的房子会触发报警 如何使抢劫收益最大化
public int Rob(int[] house){
int rob=0;
int nonRob=0;
int maxMoney=0;
for(int i=0;i<house.length;i++){
rob=nonRob+house[i]; nonRob=maxMoney; maxMoney=Math.max(rob,nonRob);
}
return maxMoney;
}
public static void main(String[] args) {
int i=(int)(Math.random()*10+1);
int[]house=new int[i];
System.out.println("共有"+i+"所房屋");
for(int a=0;a<i;a++){
house[a]=(int)(Math.random()*100+1); System.out.println("第一家"+house[a]);
}
HouseRobber houserobber=new HouseRobber();
System.out.println("最大值"+houserobber.Rob(house)); }
思路:对于第n个房间我们所能有的选择是偷和不偷, 那么如果是做决定是偷 则上一步必须是不偷
那么 这一步的就是dp[N] = num[i -1 ] + dpNonTake[N -1]
假设dp[N] 表示的是有N个元素时候的最大值状态。
如果是不偷, 那么上一步就无所谓是不是已经偷过,所以就copy为 dp[N] = dp[N -1 ]即可,
所以总而言之为 dp[N] = Math.max(dpNontake[N-1 ] + num【i】, dp[N-1] );
一个 为Rob 一个为 nonRob 和 到当前的最大值。