LintCode(M)打劫房屋(动态规划)

原创 2016年08月30日 15:04:57

最初代码:

class Solution {
public:
    /**
     * @param A: An array of non-negative integers.
     * return: The maximum amount of money you can rob tonight
     */
   long long houseRobber(vector<int> A) {
    // write your code here
    // int n = A.size();
    vector<long long> a(A.size(),0);
    if (A[1]>A[0] ) { a[0] = 0; a[1] = A[1]; }
    else { a[0] = A[0]; a[1] = 0; }
    if (A.size() == 1) return A[0];
    if (A.size() == 2) return max(A[0],A[1]);
    for (int i = 2; i<A.size(); ++i){
        a[i] = max(a[i - 2] + A[i], a[i - 1]);
    }
    return a[A.size() - 1];
}
};

运行结果:
这里写图片描述e
二次修改:

 long long houseRobber(vector<int> A) {
    // write your code here
    // int n = A.size();
    vector<long long> a(A.size(),0);
int temp1,temp2;
    if (A.size() == 1) return A[0];
    if (A.size() == 2) return max(A[0],A[1]);
    a[0] = 0; a[1] = A[1]; 

    for (int i = 2; i<A.size(); ++i){
        a[i] = max(a[i - 2] + A[i], a[i - 1]);
    }
    temp1=a[A.size()-1];
    a[0] = A[0]; a[1] = 0;
    for (int i = 2; i<A.size(); ++i){
        a[i] = max(a[i - 2] + A[i], a[i - 1]);
    }
    temp2=a[A.size()-1];
    return max(temp1,temp2);
    }

这次修改主要在于弄清a[0]和a[1]都有两种可能性,不能择大而取值。
但是结果依然有误:

但很快查明错误在哪:temp1和temp2是int型,而不是long long 型。
将这一点改正后就成功了。
在做打劫房屋2时,发现我这个通过lintcode打劫房屋1的代码居然有错,详见打劫房屋2的blog,以下为修改后的代码:

class Solution {
public:
    /**
     * @param nums: An array of non-negative integers.
     * return: The maximum amount of money you can rob tonight
     */
 long long houseRobber(vector<int> A) {
    // write your code here
    // int n = A.size();
    vector<long long> a(A.size(), 0);
    long long temp1, temp2;
    if (A.size() == 1) return A[0];
    if (A.size() == 2) return max(A[0], A[1]);
    /*a[0] = 0; a[1] = A[1];

    for (int i = 2; i<A.size(); ++i){
        a[i] = max(a[i - 2] + A[i], a[i - 1]);
    }
    temp1 = a[A.size() - 1];
    a[0] = A[0]; a[1] = 0;*/
    a[0] = A[0]; a[1] = max(A[0], A[1]);
    for (int i = 2; i<A.size(); ++i){
        a[i] = max(a[i - 2] + A[i], a[i - 1]);
    }
    temp2 = a[A.size() - 1];
    return temp2;
    //return max(temp1, temp2);

}


};
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

lintcode111爬楼梯问题(动态规划easy)

题目:假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 解决代码: public class Solution { /** *...

LintCode动态规划题总结

不知道什么是动态规划的,传送门在这儿:[干货]动态规划十问十答 动态规划进阶:动态规划:从新手到专家 相信看完上面两个链接的博客后,应该对于动态规划有一个新的认识和了解了。接下来就来看看LintCod...

011-最长公共子序列-动态规划-《算法设计技巧与分析》M.H.A学习笔记

给出两个长度分别为n和m的字符串A和B,确定A和B中最长公共子序列的长度。 朴素算法:列举A中所有的子序列2n个,并逐个判断其是否在B中(Θ(m)耗费)。时间复杂度为Θ(m2n)。 利用动态规划可以在...

HDU 1024 Max Sum Plus Plus(动态规划,给定一个数组,求其分成m个不订交子段和最大值的题目)

Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O...

【动态规划】最大m子段和

给定n个数求这n个数划分成互不相交的m段的最大m子段和。   经典的动态规划优化的问题。设f(i, j)表示前i个数划分成j段,且包括第i个数的最大m子段和,那么有dp方程:     f(i, j...

动态规划_最大m子段和

继最大子段和在空间上的推广,那么再来看看她在个数上的延伸。 最大子段和就是最大m子段和问题在m=1时的特殊情况 类似最大字段和中的b(j) 这里假设b(i,j)表示数组a的前j项中i个子段和的...

1486【动态规划★★】Max Sum Plus Plus.(求n个数m个不相交子段的最大和)

题目描述给你一个长度为n的数组(1<=n<=1000000),数组中n个元素S 1, S 2, S 3, S 4 … S n(-32768 ≤ S x ≤ 32767) 我们定义函数sum(i,j...

hdu 1024 Max Sum Plus Plus(动态规划+m子段和的最大值)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Limit: 2000/1000 MS (J...

m个工厂分的n个资源,使获得利润最大(动态规划)

import java.util.Scanner; public class Interest { public static void main(String[] args) { Sca...

012-矩阵链相乘-动态规划-《算法设计技巧与分析》M.H.A学习笔记

给定一个矩阵序列M1M2...Mn,计算乘积M1M2...Mn。要求找出一个放置括号的方式,使得标量乘法的次数最小。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)