牛客BM78-动态规划之打家劫舍问题

4 篇文章 0 订阅

      这道题相比来说是比较简单的,它其实就是将大的问题分为子问题,保证子问题最优,累计达到最优解。回到题目,这道题说,小偷偷了这一家人,就偷不了前一家和后一家的人,那么核心就在于偷不偷这一家人,偷痛失前后两家的收益,不偷则失去这一家的收益, 为了简单,我们可以 设定拿出三个的数组dp[1,2,3],dp的最大的收益是 dp[0]+dp[3] 或者是dp[2],所以我们的每一个计算最大的收益都是两者比较的值的累计之。

       做法如下,我们从第三个只要我们每次获得上上一个,上一个和自己的最大值,就可以获得自己的最大收益,再用数组存起来,最后一个的值,就是最后的收益。

package DP;
/**
 *
 * 
*
* */
public class demo7 {
    public static void main(String[] args) {
        System.out.println(demo7.rob(new int[]{1, 2, 3}));
    }
    public static int rob (int[] nums) {
        //dp[i]表示长度为i的数组,最多能偷取多少钱
        int[] dp = new int[nums.length + 1];
        //长度为1只能偷第一家
        dp[1] = nums[0];
        int i;
        System.out.println(dp[1]);
        for (i = 2; i <= nums.length; i++){
            //比较 dp[i - 1]代表上一家的收益
            //dp[i-2]等于上上一家的 nums[i - 1]代表为中间的值(因为dp的数组索引比num大了一位,所以num[i-1]代表的是当前的值)
            dp[i] = Math.max(dp[i - 1], nums[i - 1] + dp[i - 2]);

        }
        return dp[nums.length];
    }
}

动态规划在解决牛客删除括号问题时,可以按照以下步骤进行: 1. 首先,我们需要理解题目的需求。题目要求我们删除括号,使得剩下的字符串满足以下条件:左括号和右括号的数量相等,且左括号的位置必须在右括号的前面。 2. 接下来,我们可以使用动态规划来解决这个问题。我们可以定义一个三维的dp数组,其中dp[q][w][e]表示考虑s前q个字符,t前w个字符,且s被删除部分左括号数减去右括号数为e时,是否可行(bool类型)。 3. 然后,我们可以从前向后遍历字符串s和t。在每一步中,我们可以考虑两种情况: a. 删除的左括号数目比右括号多:我们可以继续删除左括号,或者删除右括号。即dp[q][w][e] = dp[q-1][w][e+1]或dp[q-1][w][e-1]。 b. 删除的左括号数目与右括号数目相同:我们只能删除右括号。即dp[q][w][e] = dp[q-1][w-1][e-1]。 4. 最后,我们可以根据dp[len1][len2][0]的值来判断是否可行。其中len1和len2分别表示字符串s和t的长度。 综上所述,通过动态规划的思路,我们可以解决牛客删除括号的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [动态规划笔记](https://download.csdn.net/download/weixin_38617297/13751806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [牛客_21303删括号_动态规划](https://blog.csdn.net/weixin_45619006/article/details/114650172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值