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);

}


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

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

思路: 最后一次的状态方程为: i=nums.size()-1;//i为最后一家 a[i]=max(houseRobber(A)+nums[i], houseRobber(B)); 说明:1....

LintCode动态规划题总结

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

LintCode 关于动态规划问题的总结

1.动态规划是解决多阶段决策问题的一种方法。 2.多阶段决策问题:如果一类问题的求解过程可以分为若干个互相联系的阶段,在每一个阶段都需作出决策,并影响到下一个阶段的决策。 3.多阶段决策问题,就是...

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

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

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

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

2017年第0届浙江工业大学之江学院程序设计竞赛决赛 M: qwb与二叉树 [记忆化dp]【动态规划】

题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=12 ——————————————————————————...

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

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

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

题目描述给你一个长度为n的数组(1

动态规划解决最少硬币凑成m元钱

322. Coin Change   Question Editorial Solution  My Submissions Total Accepted: 30668Total S...

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...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LintCode(M)打劫房屋(动态规划)
举报原因:
原因补充:

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