动态规划——简单多状态专题

news2024/10/9 20:30:29

一、按摩师(打家劫舍 | )

1.链接

面试题 17.16. 按摩师 - 力扣(LeetCode)

2.描述

3.思路

4.参考代码

class Solution {
public:
    int massage(vector<int>& nums) 
    {
        int n = nums.size();
        if(n == 0)
        {
            return 0;
        }

        vector<int> f(n);
        vector<int> g(n);
        f[0] = nums[0];
        g[0] = 0;
        for(int i = 1;i<n;i++)
        {
            f[i] = nums[i] + g[i-1];
            g[i] = max(f[i-1],g[i-1]);
        }
        return max(f[n-1],g[n-1]);
    }
};

二、打家劫舍 ||

1.链接

213. 打家劫舍 II - 力扣(LeetCode)

2.描述

3.思路

4.参考代码

class Solution {
public:

    int rob1(vector<int>& nums,int begin,int end)
    {
        if(begin > end)
        {
            return 0;
        }
        vector<int> f(nums.size());
        vector<int> g(nums.size());
        f[begin] = nums[begin];
        g[begin] = 0;
        for(int i = begin+1 ; i<=end ; i++)
        {
            f[i] = g[i-1] + nums[i];
            g[i] = max(f[i-1],g[i-1]);
        }
        return max(f[end],g[end]);
    }
    int rob(vector<int>& nums) 
    {
        int n = nums.size();
        if(n == 0) return 0;

        return max(nums[0]+rob1(nums,2,n-2),rob1(nums,1,n-1));
    }
};

三、删除并获得点数

1.链接

740. 删除并获得点数 - 力扣(LeetCode)

2.描述

3.思路

题目分析,本题中的数据和数组的顺序本身并不相关,根据题意我们可以对数据进行一个预处理,用一个数组,利用数组的下标去和数据建立一个映射关系,这样就可以把问题转换成了打家劫舍问题,打家劫舍的思路就不重复了

4.参考代码

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) 
    {
        //对数据预处理,先找到最大值
        int n = nums[0];
        for(int i = 1;i<nums.size();i++)
        {
            n = max(n,nums[i]);
        }
        vector<int> hash(n+1,0);
        for(int i = 0;i<nums.size();i++)
        {
            hash[nums[i]]++;
        }
        auto f = hash;
        auto g = hash;
        f[1] = hash[1];
        g[1] = 0;
        for(int i = 2;i<=n;i++)
        {
            f[i] = g[i-1] + hash[i]*i;
            g[i] = max(f[i-1],g[i-1]);
        }
        return max(f[n],g[n]);
    }
};

四、粉刷房子

1.链接

LCR 091. 粉刷房子 - 力扣(LeetCode)

2.描述

3.思路

4.参考代码

class Solution {
public:
    int minCost(vector<vector<int>>& costs) 
    {
        int n = costs.size();
        vector<int> f(n);
        vector<int> g(n);
        vector<int> h(n);
        f[0] = costs[0][0] , g[0] = costs[0][1] , h[0] = costs[0][2];
        for(int i = 1; i < n;i++)
        {
            f[i] = costs[i][0] + min(g[i-1],h[i-1]);
            g[i] = costs[i][1] + min(f[i-1],h[i-1]);
            h[i] = costs[i][2] + min(f[i-1],g[i-1]);
        }
        return min(min(f[n-1],g[n-1]),h[n-1]);
    }
};

五、买卖股票的最佳时机含冷冻期

1.链接

309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode)

2.描述

3.思路

4.参考代码

class Solution 
{
public:
    int maxProfit(vector<int>& prices) 
    {
        int n = prices.size();
        vector<vector<int>> dp(n,vector<int>(3,0));
        //dp[i][0] 表示买入 , dp[i][1] 表示卖出, dp[i][2] 表示冷冻期
        dp[0][0] = -prices[0];
        for(int i = 1;i<n;i++)
        {
            dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);
            dp[i][1] = max(dp[i-1][1],dp[i-1][2]);
            dp[i][2] = dp[i-1][0] + prices[i];
        }
        return max(dp[n-1][2],dp[n-1][1]);
    }
};

六、买卖股票的最佳时机含手续费

1.链接

714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)

2.描述

3.思路

4.参考代码

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) 
    {
        int n = prices.size();
        vector<int> f(n,0);
        auto g = f;
        // f表示可买(没有股票) g表示不可买(已有股票)
        g[0] = -prices[0];
        for(int i = 1;i<n;i++)
        {
            f[i] = max(f[i-1],g[i-1]+prices[i]-fee);
            g[i] = max(g[i-1],f[i-1]-prices[i]);
        }
        return max(f[n-1],g[n-1]);
    }
};

七、买卖股票的最佳时机(最终版本)

1.链接

188. 买卖股票的最佳时机 IV - 力扣(LeetCode)

2.描述

3.思路

4.参考代码

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) 
    {
        const int num = 0x3f3f3f3f; 
        int n = prices.size();
        vector<vector<int>> f(n,vector<int>(k+1,-num));
        auto g = f;

        f[0][0] = -prices[0];
        g[0][0] = 0;
        for(int i = 1;i<n;i++)
        {
            for(int j = 0;j<=k;j++)
            {
                f[i][j] = max(f[i-1][j],g[i-1][j]-prices[i]);
                g[i][j] = g[i-1][j];
                if(j != 0)
                {
                    g[i][j] = max(g[i][j],f[i-1][j-1]+prices[i]);
                }
            }
        }
        int ret = g[n-1][0];
        for(int i = 1 ; i<=k;i++)
        {
            ret = max(ret,g[n-1][i]);
        }
        return ret;
    }
};

总结

本篇总结了关于多状态的动态规划,整理了一些简单的算法题,也有自己的分析和参考代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1554506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

整理git上的模板框架

vite-vue3.0-ts-pinia-uni-app 技术栈的app框架 功能&#xff1a;基于 uni-app&#xff0c;一端发布多端通用&#xff0c;目前已经适配 H5、微信小程序、QQ小程序、Ios App、Android App。 taro3vue3tsnutuipinia taro3 框架小程序跨端平台 vue3.0-element-vite-qiankun 后台…

vue3+threejs新手从零开发卡牌游戏(十四):调整卡组位置,添加玩家生命值HP和法力值Mana信息

由于之前的卡组位置占了玩家信息的位置&#xff0c;所以这里将它调整到site区域&#xff1a; 修改game/site/p1.vue&#xff0c;在site右下角添加一个卡组区域&#xff1a; // 初始化己方战域 const init () > {let sitePlane scene.getObjectByName("己方战域Plan…

【干货分享】OpenHarmony轻量系统适配方案

1. 简介 本文在不改变原有系统基础框架的基础上&#xff0c; 介绍了一种OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;轻量系统适配方案。 本方案使用的是 OpenHarmony v3.2 Release版本源码。 2. 方案设计 本文使用的硬件模块的主要特性及功能如…

基于最小二乘支持向量机(LSSVM)的数据时序预测(单输入输出)

作品描述付费内容发布设置 宋体 黑体 微软雅黑 monospace cursive Sans Serif Inconsolata Roboto Mirza Arial 代码原理 基于最小二乘支持向量机&#xff08;LSSVM&#xff09;的数据时序预测&#xff08;单输入输出&#xff09;是指利用LSSVM模型来预测未来时序数据的单个…

Flutter环境搭建及版本管理

前言 Flutter已成为移动应用开发的主流选择&#xff0c;其跨平台优势日益凸显&#xff0c;使学习Flutter成为现代开发者的必备技能。越来越多的公司和团队选择Flutter构建应用&#xff0c;这为开发者提供了更广阔的就业机会和职业发展空间。Flutter的热度源自其强大的特性和生…

某红队面试经验

背景 据小道消息说今年的国护疑似提前到了五月份&#xff0c;所以最近也是HW面试的一个高峰期啊&#xff0c;这里分享一下上次的红队面试问题 面试问答 问&#xff1a;Java 反序列化的原理&#xff1f; 答&#xff1a;如果Java应用对用户输入&#xff0c;即不可信数据做了反…

Docker命令及部署Java项目

文章目录 简介Docker镜像镜像列表查找镜像拉取镜像删除镜像镜像标签 Docker容器容器启动容器查看容器停止和重启后台模式和进入强制停止容器清理停止的容器容器错误日志容器别名及操作 Docker部署Java项目 简介 Docker是一种容器化技术&#xff0c;可以帮助开发者轻松打包应用…

大话设计模式之代理模式

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许通过代理对象控制对另一个对象的访问。代理对象充当客户端和实际对象之间的中介&#xff0c;客户端通过代理对象间接访问实际对象&#xff0c;从而可以在访问控制、缓存、延迟加载等方面提…

yolo系列热力图,即插即用。

原地址&#xff1a;https://github.com/z1069614715/objectdetection_script/tree/master/yolo-gradcam

反应式编程(二)什么是粘包、拆包?如何解决?

目录 一、粘包、拆包介绍1.1 什么是 TCP 协议&#xff1f;1.2 什么是粘包、拆包&#xff1f;1.3 粘包、拆包的四种情况1.4 粘包、拆包的原因1&#xff09;TCP协议中的滑动窗口机制2&#xff09;传输层的 MSS 与链路层的 MTU3&#xff09;TCP协议中的 Nagle 算法4&#xff09;应…

git配置SSH 密钥

git配置SSH 密钥 1.window配置ssh1.安装ssh2.安装 Git&#xff08;安装教程参见安装Git&#xff09;并保证版本大于 1.9![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e59f4e16b83c45649f1d9d7bd6bf92c0.png)3.SSH 尽量保持最新&#xff0c;6.5之前的版本由于使用…

【文献分享】PyPlume程序:快速海洋表面传输评估的工具包

PyPlume: A toolkit for rapid ocean surface transport assessments PyPlume&#xff1a;快速海洋表面传输评估的工具包 PyPlume 是一个 Python 工具箱和管道&#xff0c;用于统一从模型和观测加载二维洋流矢量场、模拟轨迹模型以及分析和可视化粒子轨迹的过程。提供了 Ju…

python 如何安装redis

一、redis介绍 redis是一个非关系型的缓存数据库&#xff0c;因为是缓存所以redis的速度会非常快。redis主要是依靠键值对进行存储&#xff0c;类似于java的map、python的字典。redis支持许多的语言&#xff0c;如java、C、C、C#、PHP、JavaScript、Perl、python等。 二、pyt…

基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的高校普法系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

redis 的设计与实现(三)——对象

1. 前言&#xff1a; 在第一章节我们了解到了&#xff0c;redis底层所涉及的数据结构&#xff0c;但是这并非是离我们最近的一层&#xff0c;在此之上&#xff0c;redis实现了一层对象与我们交互。我们在本篇内容中将了解到&#xff1a; 对象对应的实现redis一些常用特性的实现…

物联网实战--入门篇之(三)嵌入式STM32

目录 一、Keil简介 二、工程结构 三、文件目录 四、STM32简介 五、编码风格 六、总结 一、Keil简介 Keil是一款常用的单片机开发工具&#xff0c;主要包含了编译、仿真、调试和开发界面(IDE)&#xff0c;后被ARM公司收购&#xff0c;与其MDK-ARM合并为MDK-ARM Keil软件包…

宝塔面板操作一个服务器域名部署多个网站

此处记录IP一样&#xff0c;端口不一样的操作方式&#xff1a; 宝塔面板操作&#xff1a; 1、创建第一个网站&#xff1a; 网站名用IP地址&#xff0c;默认80端口。 创建好后&#xff0c;直接IP访问就可以了。看到自带的默认首页 2、接下来部署第二个网站&#xff1a; 仍然是…

Spark-Scala语言实战(7)

在之前的文章中&#xff0c;我们学习了如何在IDEA中导入jars包&#xff0c;并做了一道例题&#xff0c;了解了RDD。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢…

自建机房私有云吗?

大家好&#xff0c;我是小码哥&#xff0c;之前一种有没搞清楚公有云、私有云的概念&#xff0c;今天算是弄清楚了&#xff0c;这里给大家分享一下公有云、私有云的区别&#xff0c;以及自建机房算不算私有云&#xff01; 其实私有云&#xff08;Private Cloud&#xff09;和公…

修复系统中缺失的VCRUNTIME140.dll文件DLL错误问题

在计算机编程中&#xff0c;动态链接库&#xff08;DLL&#xff09;是一种重要的组件&#xff0c;它提供了许多功能和资源供程序使用。其中&#xff0c;VCRuntime140.dll是Visual C Redistributable Packages的一部分&#xff0c;它包含了运行C应用程序所需的运行时库。本文将详…