NC144:不相邻最大子序列和

不相邻最大子序列和

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

解法1:动态规划

设置一个状态转移数组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[i] 表示当前 i 个最大和
        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];
    }

解法2:循环

逆序遍历

    public long subsequence (int n, int[] array) {
        // write code here
        long a=0,b=0,c=0;
        for(int i=n-1;i>=0;i--){
            c=Math.max(a,array[i]+b);
            b=a;
            a=c;
        }
        return c;
    }

正序遍历

    public long subsequence (int n, int[] array) {
        // write code here
        long a=0,b=0;
        //因为dp[i]只与dp[i-1]和dp[i-2]有关
        //所以分别定义两个数表示dp[i-1]和dp[i-2];
        for(int i=0;i<n;i++){
            long tmp=Math.max(b,a+array[i]);
            //相当于dp[i]=max(dp[i-1],dp[i-2]+array[i]);
            a=b;
            b=tmp;
        }
        return b;
    }
名企高频面试算法题解 文章被收录于专栏

牛客题霸 - 程序员面试高频题 - 题解

全部评论

相关推荐

11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务