首页 > 其他分享 >线性dp:大盗阿福(打家劫舍)

线性dp:大盗阿福(打家劫舍)

时间:2024-08-24 09:04:20浏览次数:8  
标签:大盗 10 样例 阿福 不偷 店铺 dp

大盗阿福

  • 本题与leetcode198题——打家劫舍的题意一模一样,阅读完本文以后可以尝试以下题目

力扣题目链接)

题目叙述:

阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。这条街上一共有N家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。作为一向谨慎作案的大盗阿福不愿意冒着被警察追捕的风险行窃。他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?

输入格式

  • 输入的第一行是一个整数T,表示一共有T组数据。
  • 接下来的每组数据,第一行是一个整数N,表示一有N家店铺。
  • 第二行是N个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过1000。

输出格式

  • 对于每组数据,输出一行。该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。

输入样例:

2
3
1 8 2
4
10 7 6 14

输出样例:

8
24

样例解释:

  • 对于第一组样例,阿福选择第2家店铺行窃,获得的现金数量为8。对于第二组样例,阿福选择第1和4家店铺行窃获得的现金数量为10+14=24.

动态规划思路分析

  • 设我们打劫的店铺数量为i,获取的价值和为dp ,那么dp明显是i的一个函数,那么我们就用dp[i]作为状态变量,dp[i]表示偷前i家店铺所能获取的价值最大值

状态变量以及它的含义

  • 由上面分析可知,我们设立dp[i] 作为状态变量,并且dp[i]的含义是偷前i家店铺所能获取收益的最大值.

递推公式

  • 我们设dp[i] ,在i的这个位置有两种状态:
    • 1.第i家店铺不偷——dp[i]=dp[i-1]
    • 2.第i家店铺偷——dp[i]=dp[i-2]+w[i],w[i]为第i家店铺的价值

具体细节如下图所示:

  • img

遍历顺序:

  • 由上面两步分析可知,dp[i]的状态一定是由前面dp[i-1]dp[i-2],推出来的,所以说遍历顺序一定是从前向后遍历。

如何初始化?

  • 我们首先得处理好边界条件:dp[0]dp[1]怎么处理?
  • 偷前0家店铺的最大价值显然是0,偷前1家店铺的最大价值显然为w[1]
  • 处理好边界条件以后,我们再从前向后,依据递推公式进行递推就行了

举例验证dp数组

下标:1,2,3,4

w[i]:10,7,6,14

dp[i]:10,10,16,24

  • 通过样例2分析可知,我们的dp数组没有分析错。因此我们验证了我们的dp数组的正确性。

优化

  • 我们可以用dp[i-1]的状态直接推出dp[i]的状态。

  • 我们状态表示可以优化成:

    • f[i][0]表示不偷第i家店铺能获取的最大值
    • f[i][1]表示偷第i家店铺能获取的最大值
  • 那么我们的状态转移方程就可以从dp[i-1]推出,不偷第i家店铺,那么我们就可以偷第i-1家店铺,也可以不偷,我们选取这两个之中的最大值,如果偷第i家店铺的话,第i-1家店铺我们一定只能选择不偷。

    • 不偷:dp[i][0]=max(dp[i-1][0],dp[i-1][1])
    • 偷:dp[i][1]=dp[i-1][0]+w[i]

    img

优化后的边界处理:

  • 不偷第1家店铺:f[i][0]=0
  • 偷第1家店铺:f[i][1]=w[1]

优化后的代码处理:

scanf("%d",&t)
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&w[i]);
        f[1][0]=0;f[1][1]=w[1];
        for(int i=2;i<=n;i++){
            f[i][0]=max(f[i-1][0],f[i-1][1]);
            f[i][1]=f[i-1][0]+w[i];
        }
        printf("%d\n",max(f[n][0],f[n][1]));
    }

总结:

img

  • 我们上面讲述的两种方法,第一种方法叫做分步转移,第二种方法叫做分类转移,在有些情况下,二者都能使用,而在某些题目当中,只能使用分类转移的方法,我们在以后也会介绍的!希望大家能理解这两种做法。

标签:大盗,10,样例,阿福,不偷,店铺,dp
From: https://www.cnblogs.com/Tomorrowland/p/18369823

相关文章

  • Bomb(数位DP)
    题目描述Thecounter-terroristsfoundatimebombinthedust.Butthistimetheterroristsimproveonthetimebomb.Thenumbersequenceofthetimebombcountsfrom1toN.Ifthecurrentnumbersequenceincludesthesub-sequence"49",thepowero......
  • 半回文串(dp套dp)
    第4题   半回文串 查看测评数据信息给定一个长度为n的只含小写英文字母的字符串S和一个整数k,请你将S分成k个子字符串,使得每个子字符串变成半回文串需要修改的字符数目最少。请你返回一个整数,表示需要修改的最少字符数目。下面定义什么事半回文串:如果一个字符串从左往右......
  • 线性dp:编辑距离
    编辑距离本题与力扣72.编辑距离题意一样,阅读完本文可以尝试leetcode72.力扣题目链接题目叙述输入两个字符串a,b。输出从字符串a修改到字符串b时的编辑距离输入NOTVLOVER输出4题目解释:动态规划思路这个问题显然是一个最优解问题,我们可以考虑动态规划的思路,那么我......
  • 计算机网络——TCP协议与UDP协议详解(下)
    一、TCP协议1.1TCP协议的报文TCP全称为"传输控制协议(TransmissionControlProtocol")。人如其名,要对数据的传输进行一个详细的控制。我们先看其报文格式,如下图:TCP报文由以下几个字段组成:源端口号和目标端口号:每个TCP连接都有一个源端口号和一个目标端口号。源端口号......
  • 代码实现WordPress主动推送及自动推送至百度搜索收录
    站长们辛辛苦苦写的文章,无非就是让百度收录,也可以帮助人,也可以给自己站或者帮人优化的站带来流量,今天就来发一篇关于wordprss主动推送给百度的方法;使用方法,U8格式放在wp当前模板functions.php里即可12345678910111213141516171819202122232425262......
  • 阿里dataworks通过pyodps 3获取表元数据及质量稽核
    用途:本脚本的主要作用就是获取所属工作空间中表字段信息核心脚本:本逻辑主要需要五个核心脚本:00_task_meta_setup_time#用于创建表及设置odps的启动时间01_task_meta_fields_move#搬迁数据02_task_meta_tables#表元数据获取及数据量统计03_task_meta_fields_parallel......
  • QPointer、QScopedPointer、QSharedPointer、QWeakPointer
    QPointer、QScopedPointer、QSharedPointer、QWeakPointerQSharedPointer:std::shared_ptrQWeakPointer:std::weak_ptrQScopedPointer:std::unique_ptrQPointer:无STL等效项。QObject析构时为空。QPointer功能:一个“半自动”的指针包装器。通常情况下,我们在手动delete一......
  • 遷移Wordpress到新域名,新子域名
    1.0前言把Wordpress遷移到WordpressMultiSites的子域名,因此“All-in-OneWPMigrationandBackup”就需要付費VIP才支持遷移子域名。但用手動方法也可以實現遷移到子域名。延伸文章:Wordpress主題文章wordpress更改domain域名和數據庫連接2.0 “All-in-OneWPMigratio......
  • 线性dp:最长公共子序列
    最长公共子序列本文讲解的题与leetcode1143.最长公共子序列这题一样,阅读完可以挑战一下。力扣题目链接题目叙述:给定两个字符串,输出其最长公共子序列,并输出它的长度输入:ADABEC和DBDCA输出:DBC3解释最长公共子序列是DBC,其长度为3动态规划思路:我们这题先构建一个模......
  • 线性dp:最长公共子串
    最长公共子串本文讲解的题与leetcode718.最长重复子数组,题意一模一样,阅读完本文以后可以去挑战这题。力扣链接题目叙述:给定两个字符串,输出其最长公共子串的长度。输入ABACCBAACCAB输出3解释最长公共子串是ACC,其长度为3。与最长公共子序列的区别公共子串:字符必须......