打家劫舍问题

不相邻最大子序列和

http://www.nowcoder.com/questionTerminal/269b4dbd74e540aabd3aa9438208ed8d

其实就是一个打家劫舍的问题,数组中每一个元素值就是可以偷的金额,相邻的不能偷,求能够偷出的最大金额是多少。

设置一个状态转移数组dp,dp[i]表示数组中前i个元素所能偷的最大金额是多少

状态转移表达式:
(1)对于当前的元素arr[i],如果偷,那么dp[i] = dp[i-2] + arr[i]
(2)如果不偷,那么dp[i] = dp[i-1]

    public long subsequence (int n, int[] array) {
        // write code here


        long[] dp = new long[n + 1];

        dp[0] = 0;
        dp[1] = array[0];

        for (int i = 2; i <= n; i++) {

            dp[i] = Math.max(dp[i-1],dp[i-2] + array[i-1]);
        }

        return dp[n];
    }
全部评论
1,[-1]这个case没覆盖
1 回复 分享
发布于 2021-09-05 20:05
总计下: 如果偷, 则只能将当前的钱和上上家的钱偷回家 如果发现偷了钱还没有上一家多, 则见好就收走人
1 回复 分享
发布于 2021-05-13 12:06
要求的空间复杂度是O(1)呀
点赞 回复 分享
发布于 2022-03-11 21:57
dp[1] = Math.max(array[0], 0);
点赞 回复 分享
发布于 2021-12-23 23:11
public long subsequence(int n, int[] array) { long[] dp = new long[array.length + 1]; dp[0] = 0; dp[1] = Math.max(array[0], 0); for (int i = 2; i <= array.length; i++) dp[i] = Math.max(dp[i - 1], dp[i - 2] + array[i - 1]); return dp[n]; }
点赞 回复 分享
发布于 2021-12-03 17:01
n = 1;的时候直接返回array[0],这里要比较一下0和array[0]的大小,输出大的那个
点赞 回复 分享
发布于 2021-10-30 15:54
请问 dp[i-2] + array[i-1],为什么是加array[i-1]啊?
点赞 回复 分享
发布于 2021-03-22 22:43
我怎么看不懂。。。。
点赞 回复 分享
发布于 2021-03-20 19:02

相关推荐

2025-12-19 19:02
西安交通大学 Java
程序员牛肉:双九,而且还是西交这种比较好的985九没必要再投日常了。你投中小厂,人家会觉得你学历这么顶还面试肯定是海投的,过了你也不去。所以不约你了。 直接准备暑期实习就好,现在你可以面试。但是目的不再是去日常实习了,而是熟悉面试节奏。 后续把精力放到八股,算法和AI知识上。抽空把自己这两个项目换了,怎么选项目可以看看我主页写的文章。 你学历不错的,不要焦虑
那些拿到大厂offer的...
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
01-10 16:40
点赞 评论 收藏
分享
评论
25
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务