简单多状态dp【动态规划】

news2024/12/24 16:53:26

 

目录

 

一、按摩师

二、打家劫舍

 三、删除并获得点数

 四、粉刷房子

 五、买卖股票的最佳时机

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

七、买卖股票的最佳时机III

 八、买卖股票的最佳时机IV


一、按摩师

class Solution {
public:
    int massage(vector<int>& nums) {

        int n =nums.size();
        if(n == 0) return 0;
        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(f[n-1],g[n-1]);
    }
};

二、打家劫舍

class Solution {
public:
    int rob1(vector<int>& nums,int l,int r) {
        if(l>r) return 0;
        int n =nums.size();
        if(n == 0) return 0;
        vector<int> f(n);
        auto g = f;
        f[l] = nums[l];

        for(int i = l;i <= r;i++){
            f[i] = g[i-1] + nums[i];
            g[i] = max(f[i-1],g[i-1]);
        }
        return max(f[r],g[r]);
    }

    int rob(vector<int>& nums) {
        int n = nums.size();

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

 三、删除并获得点数

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        int n = nums.size();
        const int N = 10001;
        int arr[N] = {0}; 
        for(auto e : nums)
        {
            arr[e] += e;
        }

        vector<int> f(N);
        auto g = f;
        for(int i = 1;i < N;i++){
            f[i] = g[i-1] + arr[i];
            g[i] = max(f[i-1],g[i-1]);
        }
        return max(f[N-1],g[N-1]);
    }
};

 四、粉刷房子

 

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] = costs[i-1][0] + min(dp[i-1][1],dp[i-1][2]);
            dp[i][1] = costs[i-1][1] + min(dp[i-1][0],dp[i-1][2]);
            dp[i][2] = costs[i-1][2] + min(dp[i-1][0],dp[i-1][1]);
        }
        return min(dp[n][0],min(dp[n][1],dp[n][2]));
    }
};

 五、买卖股票的最佳时机

 

 

  

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> dp(n,vector<int>(3));
        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][1],dp[n-1][2]);
    }
};

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

上一题用的是二维数组的第二维来表示多种状态,是因为状态比较多,如果像此题只有两种状态,就可以用两个函数,本质上是一样的。 

 

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n = prices.size();
        vector<int> f(n);
        auto g = f;
        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]- fee);
        }
        return g[n-1];
    }
};

七、买卖股票的最佳时机III

 

 

class Solution {
public:
    const int INF = 0x3f3f3f3f;
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> f(n,vector<int>(3,-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 < 3;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-1][j],f[i-1][j-1]+prices[i]);
            }
        }   
        int ret = 0;
        for(int i = 0;i < 3;i++){
            ret = max(ret,g[n-1][i]);
        }
        return ret;
    }
};

 八、买卖股票的最佳时机IV

 

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int  n = prices.size();
        k = min(k,n/2); 
        const int INF = 0x3f3f3f3f;
        vector<vector<int>> f(n,vector<int>(k+1,-INF));//注意是k+1
        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-1][j],f[i-1][j-1]+prices[i]);
            }
        }
        int ret = 0;
        for(int j = 0;j <= k;j++){
            ret = max(ret,g[n-1][j]);
        }
        return ret;
    }
};

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

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

相关文章

Avalonia如何更改全局背景色

1.项目下载地址&#xff1a;https://gitee.com/confusedkitten/avalonia-demo 2.UI库Semi.Avalonia&#xff0c;项目地址 https://github.com/irihitech/Semi.Avalonia 3.ColorView&#xff0c;使用Semi.Avalonia.ColorPicker&#xff0c;Nuget获取就行 4.样式预览 以下是…

MyCat实战

概念介绍 在 MyCat 的整体结构中&#xff0c;分为两个部分&#xff1a;上面的逻辑结构、下面的物理结构。 在 MyCat 的逻辑结构主要负责逻辑库、逻辑表、分片规则、分片节点等逻辑结构的处理&#xff0c;而具体的数据存储还是在物理结构&#xff0c;也就是数据库服务器中存储的…

云原生之使用Docker部署开源建站工具Halo-V2.10版本

云原生之使用Docker部署开源建站工具Halo-V2.10版本 一、Halo-V2.10介绍1.1 Halo简介1.2 Halo特点 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Halo镜像五、部署Halo5.1…

以数据为中心 的AI v.s. 以模型为中心的AI

原文&#xff1a;Data-Centric AI vs. Model-Centric AI Introduction to Data-Centric AI 当你学习关于机器学习相关的课程时&#xff0c;通常是给你一个清洁好的数据,你的任务是利用这个数据集训练出一个最好的模型。所有在机器学习课程教的技巧都是为了这个目标&#xff1…

RT-Thread SMP介绍与移植(学习)

RT-Thread SMP介绍与移植 SMP&#xff1a;对称多处理&#xff08;Symmetrical Multi-Processing&#xff09;简称SMP&#xff0c;是指在一个计算机上汇集了一组处理器&#xff08;多CPU&#xff09;&#xff0c;各CPU之间共享内存子系统以及总线结构。 RT-Thread自4.0.0版本开…

Burstormer论文阅读笔记

这是CVPR2023的一篇连拍图像修复和增强的论文&#xff0c;一作是阿联酋的默罕默德 本 扎耶得人工智能大学&#xff0c;二作是旷视科技。这些作者和CVPR2022的一篇BIPNet&#xff0c;同样是做连拍图像修复和增强的&#xff0c;是同一批。也就是说同一个方向&#xff0c;22年中了…

基于SpringBoot的精准扶贫管理系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 贫困户信息管理 新闻类型管理 志愿者招聘管理 志愿者招聘 留言反馈管理 贫困户 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息…

【笔记】【信息论与编码】第三章 离散信源

本文是笔者在学习《信息论与编码》课程中所做的笔记&#xff0c;供个人学习记忆使用。 第三章 离散信源 文章目录 一、离散信源概念离散无记忆信源K重符号序列离散信源 二、离散信源的熵单符号离散无记忆信源熵K重符号序列离散无记忆信源熵K重符号序列离散有记忆信源熵马尔可夫…

如何在Docker部署Drupal并结合内网穿透实现远程访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

NZ系列工具NZ05:VBA不打开工作簿获取其内容

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

Linux 测试端口是否放行

Linux 测试端口是否放行 1、准备2、在 CentOS 7 上放行端口&#xff0c;你可以使用以下方法&#xff1a;4、错误解决&#xff1a;[rootlocalhost backup]# netcat -l -p 11111 netcat: cannot use -p and -l 装了netcat不能用5、能用telnet去测试吗6、效果&#xff1a; 1、准备…

简易计算器的实现:使用C语言进行基础算术运算

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

S/4 HANA 大白话 - 财务会计-4 应付、应收账款

Business Partner 业务伙伴 业务伙伴现在包括供应商伙伴和客户伙伴。 只要不是个搞空壳玩泡沫的公司&#xff0c;你基本都得有从供应商那里拿原材料或者购买零部件&#xff0c;然后进行生产&#xff0c;再售卖给客户。你得和银行打交道&#xff0c;同时也得有员工。所有这些关…

【python自动化神器pyautogui使用步骤】

python自动化神器pyautogui使用步骤 这篇文章主要给大家介绍了关于python自动化神器pyautogui使用步骤的相关资料,在Python当中不仅代码简单,而且有着非常丰富的模块,pyautogui就可以称之为自动化操作的"神器",需要的朋友可以参考下 文章目录 python自动化神器pyauto…

关于SpringBoot2.x集成SpringSecurity+JJWT(0.7.0-->0.11.5)生成Token登录鉴权的问题

项目场景&#xff1a; 问题&#xff1a;遵循版本稳定的前提下&#xff0c;搭建权限认证框架&#xff0c;基于SpringBoot2.xSpringSecurity向上依赖jjwt0.7.0构建用户认证鉴权&#xff0c;起因是某L觉得jjwt0.7.0版本&#xff0c;官方已经放弃维护&#xff0c;且从maven仓库对0…

C++11发展史

文章目录 1.ChatGpt怎么说?2.C官方文档3.C11的诞生4.C11的意义 1.ChatGpt怎么说? C11是C编程语言的一个重要版本&#xff0c;也被称为C0x。它于2011年发布&#xff0c;并引入了许多新的特性和改进&#xff0c;使得C编程更加现代化和强大。 下面是C11的一些主要特性和发展历…

IDEA报Error:java:无效的源发行版13解决方式

出现问题原因&#xff1a;原本项目是spingboot2.0版本开发的&#xff0c;IDEA启动正常&#xff0c;后期新项目使用spingboot3.0&#xff0c;通过原来的IDEA版本及JDK1.8启动报上述错误&#xff0c;以下为版本文件 解决方式&#xff1a; 项目背景&#xff1a;项目已经上线&…

C++算法:图中的最短环

题目 现有一个含 n 个顶点的 双向 图&#xff0c;每个顶点按从 0 到 n - 1 标记。图中的边由二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和 vi 之间存在一条边。每对顶点最多通过一条边连接&#xff0c;并且不存在与自身相连的顶点。 返回图中 …

【Python中单引号、双引号和三引号具体的用法及注意点】

Python中单引号、双引号和三引号具体的用法及注意点 这篇文章主要给大家介绍了关于Python中单引号、双引号和三引号具体的用法及注意点的相关资料,Python中单引号、双引号、三引号中使用常常困惑,想弄明白这三者相同点和不同点,需要的朋友可以参考下 文章目录 Python中单引号、…

Zabbix监控系统详解1 :zabbix服务部署、自定义监控项、自动发现与自动注册

文章目录 1. Zabbix 概述1.1 简介1.2 zabbix的功能组件1.2.1 Zabbix Server1.2.2 数据库1.2.3 Web 界面1.2.4 Zabbix Agent1.2.5 Zabbix Proxy1.2.6 Java Gateway 1.3 工作原理1.4 常用端口号1.5 zabbix中预设的键值1.6 自定义监控项相关流程1.7 邮件报警配置思路1.8 Zabbix自动…