简单多状态dp第二弹 leetcode -删除并获得点数 -粉刷房子

740. 删除并获得点数

删除并获得点数

分析:

使用动态规划解决

这道题依旧是 打家劫舍I 问题的变型。
我们注意到题目描述,选择 x 数字的时候, x - 1 与 x + 1 是不能被选择的。像不像 打家劫舍 问题中,选择 i 位置的金额之后,就不能选择 i - 1 位置以及 i + 1 位置的金额。因此,我们可以创建一个大小为 N(根据题目的数据范围)的 hash 数组,将 nums 数组中每一个元素 x ,累加到 hash 数组下标为 x 的位置处,然后在 hash 数组上来一次 打家劫舍 即可。

 代码:

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        int n=nums.size();
        const int N=1e4+10;

        int a[N]={0};

        for(auto num:nums)
        {
            a[num]+=num;
        }


        vector<int>f(N+1);//选
        vector<int>g(N+1);//不选
        f[0]=a[0];
        for(int i=1;i<=N;i++)
        {
            f[i]=g[i-1]+a[i-1];
            g[i]=max(g[i-1],f[i-1]);
        }

        return max(f[N],g[N]);


    }
};


LCR 091. 粉刷房子

粉刷房子

分析:

使用动态规划解决

状态表示:

这里我们选择比较常用的方式,以某个位置为结尾,结合题目要求。定义一个状态表示:但是我们这个题在 i 位置的时候,会面临「」「」「绿」三种抉择,所依赖的状态需要细

dp[i][0] 表示:粉刷到 i 位置的时候,最后一个位置粉刷上「红色」,此时的最小花
费;

dp[i][1] 表示:粉刷到 i 位置的时候,最后一个位置粉刷上「蓝色」,此时的最小花
费;
dp[i][2] 表示:粉刷到 i 位置的时候,最后一个位置粉刷上「绿色」,此时的最小花
费。

状态转移方程:

因为状态表示定义了三个,因此我们的状态转移方程也要分析三个:
对于 dp[i][0]
        如果第 i 个位置粉刷上「红色」,那么 i - 1 位置上可以是「蓝色或者绿色」。因此我们需要知道粉刷到 i - 1 位置上的时候,粉刷上「蓝色」或者「绿色」的最小花费,然后加上 i位置的花费即可。于是状态转移方程为: dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0] ;
同理,我们可以推导出另外两个状态转移方程为:
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1]
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i - 1][2]

代码:

class Solution {
public:
    int minCost(vector<vector<int>>& costs) {

        int n=costs.size();

        vector<vector<int>>dp(n+1,vector<int>(5));

        for(int i=1;i<=n;i++)
        {
            dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i-1][0];
            dp[i][1]=min(dp[i-1][0],dp[i-1][2])+costs[i-1][1];
            dp[i][2]=min(dp[i-1][1],dp[i-1][0])+costs[i-1][2];
        }

        return min({dp[n][1],dp[n][0],dp[n][2]});


    }
};

LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mike!

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值