HouseRobber

假设你是一个劫匪 抢劫一条街上的房子 每个房子里有一定数目的钱 但是如果抢劫相连的房子会触发报警 如何使抢劫收益最大化

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 和 到当前的最大值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值