【一次过】Lintcode 392. 打劫房屋

假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警

给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下

样例

给定 [3, 8, 4], 返回 8.

挑战

O(n) 时间复杂度 且 O(1) 存储。


解:

先以数组arr[1,2,4,1,7,8,3]为例,要得到最优解,从最后数组的数即arr[6]开始算,最佳方案记为OPT(6),则OPT(6)有两种可能,要么选了arr[6],要么没选

根据以上递推式与递推出口,设dp[i]表示到i为止且包括i为最后一个盗窃的房子得到的最大值。

状态方程:

dp[i] = max(arr[i] + dp[i-2] , dp[i-1])

初始条件:

dp[0] = arr[0]

dp[1] = max(arr[0] , arr[1])

public class Solution {
    /**
     * @param A: An array of non-negative integers
     * @return: The maximum amount of money you can rob tonight
     */

    public long houseRobber(int[] A) {
        // write your code here
        if(A==null || A.length<=0)
            return 0;
        
        int n = A.length;
        long[] dp = new long[n];
        
        dp[0] = A[0];
        if(n>1)
            dp[1] = Math.max(A[0],A[1]);
        
        for(int i=2; i<dp.length; i++)
            dp[i] = Math.max(dp[i-1], dp[i-2] + A[i]);
        
        return dp[n-1];
    }
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 围棋游戏是一个涉及策略和技巧的棋盘游戏。编写一个19×19围棋游戏需要对棋盘游戏引擎、围棋规则、棋子颜色和棋局评估机制等多方面进行考虑和实现。 首先,我们需要编写一个棋盘游戏引擎,它可以处理棋盘的绘制、棋子的落子、悔棋等基本操作。 其次,我们需要研究并实现围棋的规则。围棋有很多细节规则,例如禁着点、死子的判定、提子等。在实现这些规则时,我们需要结合围棋的棋谱、棋规等资料进行研究。 最后,我们需要实现一个棋局评估机制,它可以对当前棋局进行评估,并在必要时给出提示或建议。 编写一个19×19围棋游戏是一个比较复杂的项目,需要涉及多方面的知识和技能。但如果对围棋感兴趣,并且有一定的编程能力,可以尝试编写一个围棋游戏,以加深对围棋的理解。 ### 回答2: 编写一个19*19的围棋游戏是一个相对庞大而且复杂的任务,需要耗费大量的时间和精力来设计和实现。下面是一个简要的描述,仅涉及一些基本的功能和实现思路。 首先,需要搭建一个19*19的游戏界面,可以使用图形界面库如Pygame来实现。界面上应该有一个棋盘,由19行和19列的交叉点组成。 接下来,需要实现落子功能。当玩家点击某个交叉点时,程序应该根据当前轮到的玩家确定该位置能否落子。如果不能落子,则要给出相应的提示。如果可以落子,则将该位置标记为黑子或白子,并切换到另一个玩家。 在编写AI时,可以选择一些基本的算法来进行决策,如蒙特卡洛树搜索或强化学习算法。这些算法可以计算出落子的概率,并选择最佳的位置进行落子。 另外,还需要实现判断胜负的功能。围棋的规则较为复杂,胜负的判断涉及到活眼、劫、打劫等情况。可以编写一些函数来判断是否有五连子或者判断是否可以提子等。 除了基本的功能,还可以考虑一些扩展功能,如悔棋功能、保存游戏进度、选择不同难度的AI等。 最后,可以通过测试用例来验证程序的正确性。可以设置一些特殊的局面、打劫等情况,并检查程序的行为是否符合规则和预期。 总之,编写一个19*19的围棋游戏是一个复杂的任务,需要考虑多个方面的功能和实现细节。以上是一个初步的描述,可以根据具体的需求和设计进行进一步的开发和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值