动态规划 不相邻小偷

82 阅读1分钟

题目

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。比如[1,2,3,1],最大金额为1+3=4

  • dp含义:不拿相邻值的范围内最大的
  • 比如6和3,d[0]拿6,d[1]拿6,因为1位置可以拿1也可以拿0
  • 这里的结构是 Math.max(Math.max(dp[i-1],arr[i]),arr[i]+dp[i-2]);而非 Math.max(dp[i-1],arr[i]+dp[i-2]),是因为还需要考虑只拿arr[i],因为存在前面全是负数的情况
function cob(arr){
  if(arr.length==0){
    return 0;
  }
    const N=arr.length;
    if(N==1){
      return arr[0];
    }
    if(N==2){
      return Math.max(arr[0],arr[1]);
    }
    const dp=[];
    dp[0]=arr[0];
    dp[1]=Math.max(arr[0],arr[1]);
    for(let i=2:i<N;i++){
      dp[i]=Math.max(Math.max(dp[i-1],arr[i]),arr[i]+dp[i-2]);
    }
    return dp
}