打家劫舍(你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。)

示例 1:

  输入: [1,2,3,1]
  输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:
  输入: [2,7,9,3,1]
  输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)
偷窃到的最高金额 = 1 + 3 = 4

通过

/**
     *
     * @param arr
     * @return
     * 运用动态规划解决该题:假设我们数组arr为{2,7,9,3,1},opt(i)表示当前利益最大化,我们从opt(4)
     * 开始,opt(4):盗贼要么盗取下标为4的房间,要么不盗取,盗取下标为4的房间,
     * 则opt(4) = opt(2) + arr[4],不盗取opt(4) = opt(3)则opt(4)在两者之间选最大值,
     * 即opt(4) = Math.max(opt(3),opt(2)+arr[4])
     * 返回判断条件:(1)数组长度等于0,return 0;
     *                 (2)数组长度等于1,return arr[0];
     *            (3)因为opt(2) = Math.max(opt(1),opt(0)+arr[2]),所以数组长度
     *            等于2的话,return Math.max(arr[0],arr[1]);
     *
     */

根据上述分析,我们给出递归方法和非递归方法

    //递归方法 
   public static int rob(int[] arr) {
        return rec_opt(arr,arr.length - 1);
    }

    public static int rec_opt(int[] arr,int i) {
        if(arr.length == 0) return 0;
        if(i == 0)
            return arr[i];
        else if(i == 1)
            return Math.max(arr[i-1], arr[i]);
        else {
            int A = rec_opt(arr,i - 2) + arr[i];
            int B = rec_opt(arr,i - 1);
            return Math.max(A, B);

        }
    }
//非递归方法
    public static int dp_opt(int[] arr) {
        if(arr.length == 0) {
            return 0;
        }
        if(arr.length == 1) {
            return arr[0];
        }
        if(arr.length == 2) {
            return Math.max(arr[0], arr[1]);
        }
        int[] opt = new int[arr.length];
        opt[0] = arr[0];
        opt[1] = Math.max(arr[1],arr[0]);
        for(int i = 2;i<opt.length;i++) {
            int A = opt[i - 2] + arr[i];
            int B = opt[i - 1];
            opt[i] = Math.max(A, B);
        }
        return opt[opt.length - 1];
    }

原文地址:https://www.cnblogs.com/duy666/p/10472892.html

时间: 2024-10-09 23:40:07

打家劫舍(你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。)的相关文章

Putty是一个专业的SSH连接客户端

http://www.putty.ws/PuTTY-LinuxVPS Putty是一个专业的SSH连接客户端,当然可以用来连接Linux操作系统的VPS.下文是Putty连接工具的使用方法与详细教程,这里的“详细”是指步骤详细,而不是介绍详细,仅适合新手. 运行后主界面如下: 1.在“主机名称(或IP地址)”中输入您的服务器的IP地址.如果您没有修改SSH端口,则端口号保持默认的22即可.当然,修改SSH的默认连接端口可以减少很多被攻击的可能. 2.点击下方的“打开”按钮: 3.稍等片刻,会提示

独有系统的两个潜在风险

某些企业有自己开发/收购的独特软件/应用/系统(以下简称“独有系统”),天下仅此一家别无分店.虽然企业可以依靠独有系统长期经营下去,然而并不意味着可以高枕无忧坐地数钱. 首先,对独有系统的资深专家来说,尽管随着经验的积累对独有系统的掌握越加深刻,然而一旦需要跳槽,那些独有系统的经验有可能变得毫无用处——因为再没有别家采用这套系统了.而一个人总的精力是有限的,很难在专精一方面的同时,还能兼顾到其它方面.这就造成,在其它企业需求的通用专业能力上 ,独有系统的资深专家反而有可能显得竞争力不足.长期来看

Axure RP一个专业的快速原型设计工具

Axure RP是一个专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写. Axure简要介绍 Axure RP已被一些大公司采用. Axure RP的使用者主要包括商业分析师.信息架构师.可用性专家.产品经理.IT咨询师.用户体验设计师.交互设计师.界面设计师等,另外,架构师.程序开发工程师也在使用Axure. Axure RP--是一个非常专业的快速原型设计的一个工具,客户提出需求,然后根据需求定

Ubuntu Linux系统包含两类环境变量

Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量.系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效. 修改用户环境变量 用户环境变量通常被存储在下面的文件中: ~/.profile ~/.bash_profile 或者 ~./bash_login ~/.bashrc 上述文件在Ubuntu 10.0以前版本不推荐使用. 系统环境变量 系统环境变量一般保存在下面的文件中: /etc/environment /etc/profile /etc/bash.ba

两张表A和B,各有一个字段,更新时间A.MODIFIED_TM和B.MODIFIED_TM,A表为主表,更新时间不为空,但是B表更新时间可能为空,现在要取A、B两表时间最新的那个,B.MODIFIED

问题描述: 两张表A和B,各有一个字段,更新时间A.MODIFIED_TM和B.MODIFIED_TM,A表为主表,更新时间不为空,但是B表更新时间可能为空,现在要取A.B两表时间最新的那个,B.MODIFIED_TM若为空就取A.MODIFIED_TM,例如: 表A ID    MODIFIED_TM 1     2013/3/10 18:07:12 2     2013/4/10 18:07:12 3     2013/5/10 18:07:12 表B ID    MODIFIED_TM 1

slideshare原本是一个专业的幻灯片存储与展示的网站

slideshare就是其中一个.slideshare原本是一个专业的幻灯片存储与展示的网站,它支持扩展名为ppt.pps和odp三种格式的幻灯片,用户上传成功以后slideshare会提供给用户一个基于flash的展示平台,同时它还会提供一段代码,方便用户将这些内容放置到自己的博客中. 可能是觉得自己提供的服务太过单一,slideshare最近开始支持doc和xls格式文件,使自己成为全面的文档分享服务提供商.由于slideshare在幻灯片分享方面颇具盛名,并且二者在使用和体验方面差别不大,

一个系统的最大并发用户数为1100,怎么能推算出该系统的支持最大用户数

一个系统的最大并发用户数为1100,怎么能推算出该系统的支持最大用户数. 其中用户性能要求如下:支持100万注册用户 性能需求分析: 1.根据用户的要求,本系统要支持100万用户,其中性能机器配置如何?高峰值是多少?带宽?等 2.如果都是采用公司的测试环境,那么本次性能应该做哪几种性能?性能评测.负载测试.强度测试? 3.怎么算出并发用户数?响应时间? 性能指标确定: 因为用户的性能需求太广,没有定到具体的数值.那么我怎么开展后继的工作?1.确定采用公司测试环境,不用考虑环境问题.也就是说,客户

Axure RP一个专业的高速原型设计工具

Axure RP是一个专业的高速原型设计工具.Axure(发音:Ack-sure).代表美国Axure公司.RP则是Rapid Prototyping(高速原型)的缩写. Axure简要介绍 Axure RP已被一些大公司採用. Axure RP的使用者主要包含商业分析师.信息架构师.可用性专家.产品经理.IT咨询师.用户体验设计师.交互设计师.界面设计师等.另外.架构师.程序开发project师也在使用Axure. Axure RP--是一个很专业的高速原型设计的一个工具,客户提出需求,然后依

Codeforces Round #283 (Div. 2) A. Minimum Difficulty【一个数组定义困难值是两个相邻元素之间差的最大值。 给一个数组,可以去掉任意一个元素,问剩余数列的困难值的最小值是多少】

A. Minimum Difficulty time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Mike is trying rock climbing but he is awful at it. There are n holds on the wall, i-th hold is at height ai off the g