DP:简单多状态模型

news2024/12/30 3:29:56

                                               创作不易,感谢三连 

    多状态DP表示第i天的时候可能的状态不同,所以我们要去区分不同的状态。

一、打家劫舍(1)

. - 力扣(LeetCode)

class Solution {
public:
    int rob(vector<int>& nums) 
    {
       int n=nums.size();
       vector<int> f(n);
       auto g=f;
       f[0]=nums[0];
       for(int i=1;i<n;++i)
       {
        f[i]=g[i-1]+nums[i];
        g[i]=max(f[i-1],g[i-1]);
       }
       return max(g[n-1],f[n-1]);
    }
};

二、打家劫舍(2)

. - 力扣(LeetCode)

class Solution {
public:
   int rob1(vector<int>& nums,int left,int right)
    {
       if(left>right)  return 0;
        int n=nums.size();
       vector<int> f(n);
       auto g=f;
       f[left]=nums[left];
       for(int i=left+1;i<=right;++i)
       {
        f[i]=g[i-1]+nums[i];
        g[i]=max(f[i-1],g[i-1]);
       }
       return max(g[right],f[right]);
    }
    int rob(vector<int>& nums) 
    {
       int n=nums.size();
       return max(nums[0]+rob1(nums,2,n-2),rob1(nums,1,n-1));
    }
};

三、删除并获得点数

. - 力扣(LeetCode)

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) 
    {
       //转化为打家劫舍问题  首先要先找到数组中的最大值,然后用这个最大值去创建数组
       int Max=*max_element(nums.begin(),nums.end());
       vector<int> all(Max+1);//数组模拟哈希表  注意映射关系!
       for(int e:nums) all[e]+=e;
       //打家劫舍的数组创建完成
       int n=all.size();
       vector<int> f(n);
       auto g=f; //不用初始化,因为都是0
       for(int i=1;i<n;++i)
       {
        f[i]=g[i-1]+all[i];
        g[i]=max(f[i-1],g[i-1]);
       }
       return max(g[n-1],f[n-1]);
    }
};

四、粉刷房子

. - 力扣(LeetCode)

class Solution {
public:
    int minCost(vector<vector<int>>& costs) 
    {
         int n=costs.size();
         vector<vector<int>> dp(n+1,vector<int>(3));
         //创建虚拟节点要注意下标的映射关系 以及虚拟节点的填值不影响最终结果
         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][0],dp[i-1][1])+costs[i-1][2];
         }
         return min(min(dp[n][0],dp[n][1]),dp[n][2]);
    }
};

五、买卖股票的最佳时机(1)

. - 力扣(LeetCode)

该题并不是用dp去做的,只是为了保证股票类型题目的齐全

思路:我们要找到最大的数和最小的数,并且保证最小的数是在最大数的左边 ,所以不能直接用找大和找小的思路,用maxi更新最大利润,用mini记录最小的股票。

class Solution {
public:
    int maxProfit(vector<int>& prices) 
    {
       int mini=INT_MAX;
       int maxi=0;
       for(int price:prices)
       {
        //遍历的时候,我们随时去更新最小的值,然后让每一位数都来-最小值 更新利润,这里不能直接用最大值
        //因为最大值可能在最小值的左边
        maxi=max(maxi,price-mini);
        mini=min(price,mini);
       }
       return maxi;
    }
};

六、买卖股票的最佳时机(2)

. - 力扣(LeetCode)

class Solution {
public:
    int maxProfit(vector<int>& prices)
    {
       //有两种状态,第i天结束处于买入状态(手上有股票,可卖)     第i天结束后处于交易状态(手上没有股票,可以买
      int n=prices.size();
      //创建两个dp表
      vector<int> f(n);//第i天结束后处于买入状态
      //情况1,前一天处于买入状态,啥也没干,还是处于买入状态f[i]=f[i-1]
      //情况2,前一天卖过,然后今天刚买     f[i]=g[i-1]-prices[i]
       auto g=f;//第i天结束后处于交易状态
       //情况1,前一天还是可交易状态,啥也没干 g[i]=g[i-1]
       //情况2.前一天处于买入状态,今天刚卖出一只股票,外加手续费 g[i]=f[i-1]+prices[i]-fee
       //初始化,
       f[0]=-prices[0];
       for(int i=1;i<n;++i)
       {
        f[i]=max(f[i-1],g[i-1]-prices[i]);
        g[i]=max(g[i-1],f[i-1]+prices[i]);
       }
       return g[n-1];
    }
};

七、买卖股票的最佳时机(3)

. - 力扣(LeetCode)

八、买卖股票的最佳时机(4)

. - 力扣(LeetCode)

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) 
    {
      const int inf=0x3f3f3f3f;//INT_MAX/2
      int n=prices.size();
      k=min(k,n/2);
      //该题涉及到3个维度,一个是价格,一个是交易次数,一个是当前的状态(2种)
      //所以我们根据当前的情况去分成两个二维数组,分别对应的一种状态,然后一个维度是价格,一个维度是交易次数
      //f表示第i天处于买入状态(有股票),g表示第i天出去卖出状态(没股票)
       vector<vector<int>> f(n,vector<int>(k+1,-inf));
       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>=1)  g[i][j]=max(g[i][j],f[i-1][j-1]+prices[i]);
        }
       }
         // int ret=0;
         //最后最大值肯定是没有股票的情况
         //for(int i=0;i<=k;++i)//在g[i]的最后一行去找最大的交易
         // ret=max(ret,g[n-1][i]);//因为不同的交易次数都可能会得到不一样的结果
          //对于一个递减的数列来说,交易0次的结果更优
          return *max_element(g[n-1].begin(),g[n-1].end());//找到最大值的位置
    }
};

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

. - 力扣(LeetCode)

十、多状态dp的简单总结

1、通过买卖股票3可以发现,其实对于一些可以直接枚举出情况的动态规划,我们就不一定需要去创建一个dp数组,而是直接根据枚举的几种方式创建变量去模拟,这样更高效

2、通过买卖股票4我们可以发现,我们对dp数组不存在的状态设计虚拟节点这个思路还可以是从动态转移方程上入手,用条件判断去规避不存在的状态

3、通过买卖股票的最佳时机含冷冻期可以发现,要认真的思考当前状态下,前一个状态可能是什么样的,通过今天进入新状态时又是怎么样的

4、虚拟节点设置的时候,如果我们设计最大值和最小值,可能会存在越界的风险,所以我们可以用0x3f3f3f3f来初始化比较保险

5、学会去在动态规划以外的地方去做优化

 

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

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

相关文章

C++初步认识

一.开发环境 Dev-C是一个Windows环境下的一个适合于初学者使用的轻量级C/C 集成开发环境&#xff08;IDE&#xff09;&#xff0c;它是一款自由软件&#xff0c;遵守GPL许可协议分发源代码。 Dev-C 使用MingW64/TDM-GCC编译器&#xff0c;遵循C 11标准&#xff0c;同时兼容C98标…

jmeter二次开发发送java请求_保姆级教程!!!

一、引言 JMeter是Apache基金会开发的一款开源性能测试工具&#xff0c;广泛应用于软件性能测试领域。它能够模拟多线程并发用户对应用程序进行压力测试&#xff0c;以评估应用程序的性能和稳定性。然而&#xff0c;在实际使用过程中&#xff0c;用户可能会遇到需要发送Java请…

网上国网App启动鸿蒙原生应用开发,鸿蒙开发前景怎么样?

从华为宣布全面启动鸿蒙生态原生应用一来&#xff0c;各种各样的新闻就没有停过&#xff0c;如&#xff1a;阿里、京东、小红书……等大厂的加入&#xff0c;而这次他们又与一个国企大厂进行合作&#xff1a; 作为特大型国有重点骨干企业&#xff0c;国家电网承担着保障安全、经…

Python 全栈体系【四阶】(二十一)

第五章 深度学习 二、推荐系统 2. 协同过滤及实现 2.1 基于物品的协同过滤推荐技术(评分) 2.2 基于物品的协同过滤算法(Item_CF) 2.3 基于用户的协同过滤算法&#xff08;user-based collaboratIve filtering&#xff09; 2.4 基本原理 2.5 ICF 计算物品之间的相似度&#…

Set和Map数据结构

Set和Map数据结构理解 Set&#xff1a; 1、es6新的数据结构&#xff0c;类似数组&#xff0c;但成员唯一 2、实例属性&#xff1a;Set.prototype.size返回Set实例的成员总数 3、操作方法&#xff1a;add、delete、has、clear 4、遍历操作&#xff1a;forEach、keys、values、en…

求两个单链表的差集

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 但行前路&#xff0c;不负韶华&#…

搭建Hadoop HA

目录 前言 搭建前准备 搭建 前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构&#xff0c;它允许用户在不了解分布式底层细节的情况下开发分布式程序&#xff0c;充分利用集群的威力进行高速运算和存储。Hadoop主要解决大数据存储和大数据分析两大核心问题&…

机器学习(二)

线性模型: 离散转为连续的变换: 检查是否有“序”的变化&#xff0c;若有“序”&#xff0c;则连续化&#xff1b;否则&#xff0c;转化为k维向量 最小二乘解: 多元线性回归: 广义线性模型: 线性判别分析: 由于将样例投影到一条直线(低维空间)&#xff0c;因此也被视为一种&q…

excel统计分析——协方差分析基本原理

参考资料&#xff1a;生物统计学 方差分析中&#xff0c;要求除试验因素外的其他条件保持在相同水平上才能对实验结果的差异显著性进行比较&#xff0c;然而有些非试验因素很难或不可能人为控制&#xff0c;此时如果使用方差分析法推断处理其差异显著性&#xff0c;往往会导致错…

深度学习-数据归一化与Batch Normalization

文章目录 数据归一化与Batch Normalization一、经典机器学习的归一化算法1.经典机器学习归一化方法回顾1.1 0-1标准化方法1.2 Z-Score标准化 2.经典机器学习归一化算法在深度学习中的实践3.Z-Score数据归一化的局限3.1 Zero-Centered特性消失3.2 Zero-Centered Data的作用局限 …

【AI】使用Azure OpenAI创建自己的AI应用!

【AI】使用Azure OpenAI创建自己的AI应用! 目录 【AI】使用Azure OpenAI创建自己的AI应用!创建工作区模型介绍部署模型API参数计算Token使用Python SDK调用补全模型调用对话模型流式调用异步调用提示技巧生成对话分类推荐超级课程: Docker快速入门到精通Kubernetes入门到大师…

Golang-MAP源码学习、扩容机制等

前言 map是golang中常用的一个基本数据结构&#xff0c;继上篇的channel源码学习之后&#xff0c;本文学习map的源码相关。 基础知识点 此部分参考自 https://www.zhihu.com/tardis/zm/art/423008350?source_id1003 map的用法 通过make初始化分配容量&#xff0c;通过m[k…

鸿蒙操作系统-初识

HarmonyOS-初识 简述安装配置hello world1.创建项目2.目录解释3.构建页面4.真机运行 应用程序包共享包HARHSP 快速修复包 官方文档请参考&#xff1a;HarmonyOS 简述 1.定义&#xff1a;HarmonyOS是分布式操作系统&#xff0c;它旨在为不同类型的智能设备提供统一的操作系统&a…

OpenHarmony内核编程实战

在正式开始之前&#xff0c;对于刚接触OpenHarmony的伙伴们&#xff0c;面对大篇幅的源码可能无从下手&#xff0c;不知道怎么去编码写程序&#xff0c;下面用一个简单的例子带伙伴们入门。 ▍任务 编写程序&#xff0c;让开发板在串口调试工具中输出”Hello&#xff0c;Open…

程序猿成长之路之数据挖掘篇——数据挖掘介绍

随着java的发展&#xff0c;数据挖掘也变得逐渐热门&#xff0c;我们随手打开一个购物网站&#xff0c;首先映入眼帘的便是五花八门的推荐的物品&#xff0c;又如我们逛抖音、快手&#xff0c;就在我们上下刷屏的过程中&#xff0c;系统就会不停的推荐新的视频内容过来。不论是…

浏览器https受信任证书生成——openssl颁发受信任证书

站点常常由于没有受信任的第三方CA机构颁发证书,使用https访问时,浏览器常常会弹出不安全的提示,为解决该问题,可以使用openssl颁发个人证书来解决该问题。 1openssl安装及使用方式参考:32.9 x509_OpenSSL 中文手册https://www.openssl.net.cn/docs/230.html2.本文章所有生…

【python】flask模板渲染引擎Jinja2,通过后端数据渲染前端页面

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【医学实体识别】从糖尿病论文和临床指南中,做关键信息分类

从糖尿病论文和临床指南中&#xff0c;做关键信息分类 实体识别输入输出疾病实体治疗实体常规实体 算法设计BiLSTM-CRF 论文BiLSTM-CRF 应用BiLSTM-CRF VS 大模型 构建知识图谱 实体识别 比赛&#xff1a;https://tianchi.aliyun.com/competition/entrance/231687/information…

以太网PHY,MAC及其通信接口介绍

本文主要介绍以太网的 MAC 和 PHY&#xff0c;以及之间的 MII&#xff08;Media Independent Interface &#xff0c;媒体独立接口&#xff09;和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 一&#xff1a;简介 从硬件的角度看&#xff0c;以太网接口电路主要由MA…

下载最新VMware,专业版本

VMware - Delivering a Digital Foundation For BusinessesRun any app on any cloud on any device with a digital foundation built on VMware solutions for modern apps, multi-cloud, digital workspace, security & networking.https://www.vmware.com/ 官网地址