C++ 多状态dp

news2024/10/1 12:22:12

目录

按摩师

打家劫舍

打家劫舍2

删除并获得点数

粉刷房子


按摩师

面试题 17.16. 按摩师

最大值问题

f : 预约此次的最长时间    g :不预约此次的最长时间

出现的错误:return max(f[n - 1]), g[n - 1]);  

注意:①题目没给nums的范围,if(n == 0) return 0;没有判0,就会报错

 ②奇怪的是不是在执行的时候报错,而是在运行样例的时候报这个错误

参考代码

class Solution {
public:
    int massage(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n), g(n);
        if(n == 0) return 0;
        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]);
        //return max(f[n - 1]), g[n - 1]);
    }
};

打家劫舍

198. 打家劫舍

参考代码

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n), g(n);
        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]);
    }
};

打家劫舍2

213. 打家劫舍 II

最大值问题

f : 取当前位置的值,且是当前位置为结尾的最大值

g:不取当前位置的值,且是当前位置为结尾的最大值

注意点:①传到函数参数的问题,这里的有效区间是[left, right]

②按照nums[0] 去与不取划分,因为nums.size() >= 1,按照nums[2]划分这么写会出现下标越界

参考代码

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

删除并获得点数

740. 删除并获得点数

注释掉的也对,没发现写成arr[i - 1],10000取不上,然后改成10002

参考代码1

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        // vector<int> f(10002), g(10002), arr(10002);
        // for(auto e : nums)
        //     arr[e] += e;

        // for(int i = 1; i <= 10001; i++)
        // {
        //     f[i] = g[i - 1] + arr[i - 1];
        //     g[i] = max(g[i - 1], f[i - 1]);
        // }
        // return max(f[10001], g[10001]);
        vector<int> f(10001), g(10001), arr(10001);
        for(auto e : nums)
            arr[e] += e;
        f[0] = arr[0];
        for(int i = 1; i < 10001; i++)
        {
            f[i] = g[i - 1] + arr[i];
            g[i] = max(g[i - 1], f[i - 1]);
        }
        return max(f[10000], g[10000]);
    }
};

注意:①这个地方是arr[i] , 不是nums[i]

☆☆②变量名和函数名一样

vs下可以看出,这里的max是一个变量不是函数 ,对于下面的报错的理解:这不是一个函数,不能有()

明显调用的表达式前的括号必须具有(指针)函数类型 

也不是不能改:

力扣下:报错也是很明显了    被调用的对象不是函数或者函数指针

参考代码2

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        int n = nums.size();
        int m = 0;
        for(auto e : nums)
            m = max(e, m);
        vector<int> f(m + 1), g(m + 1), arr(m + 1);
        for(auto e : nums)
            arr[e] += e;
        f[0] = arr[0];//可以不写,因为最小是1;
        for(int i = 1; i < m + 1; i++)
        {
            f[i] = g[i - 1] + arr[i];//
            g[i] = max(f[i - 1], g[i - 1]);
        }
        return max(g[m], f[m]);
    }
};

粉刷房子

LCR 091. 粉刷房子

我写的都是没有扩容,一维dp初始化的并不多,且不用偏移量

错误 ①return min(red[n - 1], max(blue[n - 1], green[n - 1]));

参考代码

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

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

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

相关文章

软件杯 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…

【C++】深度解剖多态

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是多态&#xff0c;熟练掌握多态的定义&a…

预约自习室

预约自习室 1、技术介绍 自习室预约系统的后端开发语言采用Node&#xff0c;后端开发框架采用Express&#xff0c;数据库采用的Node的最佳搭档MySQL。采用Vue作为前端开发框架&#xff0c;Element-UI作为开发的组件库&#xff0c;微信小程序。期间采用axios实现网页数据获取&a…

[java入门到精通] 19 网络编程,设计模式

今日目标 网络编程 TCP通信 Junit单元测试 单例设计模式 多例设计模式 工厂设计模式 1 网络编程 1.1 软件架构 C/S结构 &#xff1a;全称为Client/Server结构&#xff0c;是指客户端和服务器结构。常见程序有&#xff31;&#xff31;、迅雷等软件B/S结构 &#xff1a…

Biomedical knowledge graph-enhanced prompt generation for large language models

1. 生物医学知识图谱增强大语言模型提示生成 论文地址&#xff1a;[2311.17330] Biomedical knowledge graph-enhanced prompt generation for large language models (arxiv.org) 源码地址&#xff1a;https://github.com/BaranziniLab/KG_RAG 2. 摘要 大语言模型&#xff0…

MySQL--索引优化实战篇(1)

前言&#xff1a; 我们常说的SQL优化&#xff0c;简单来说就是索引优化&#xff0c;通过合理创建索引&#xff0c;调整SQL语法等&#xff0c;来提升查询效率&#xff0c;想要进行SQL优化&#xff0c;就必须知道索引的原理&#xff0c;而且能够看懂SQL的执行计划。 MySQL–索引…

基于springboot的校园二手交易平台(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

STM32OLED调试工具

OLED介绍 4个引脚的oled &#xff1a; GND引脚接地&#xff0c;VCC接3.3v的电源 SCL与SDA是I2C通信的引脚 使用OLED显示屏驱动函数模块 接线图 将oled函数调试的代码引入到工程项目中 oled工程代码 OLED.C文件代码 #include "stm32f10x.h" #include "OLED_Font…

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor

arxiv 2023 08的论文 1 intro 1.1 人类流动性的独特性 人类流动性的独特特性在于其固有的规律性、随机性以及复杂的时空依赖性 ——>准确预测人们的行踪变得困难近期的研究利用深度学习模型的时空建模能力实现了更好的预测性能 但准确性仍然不足&#xff0c;且产生的结果…

【Python数据结构与判断1/7】复杂的多向选择

目录 导入 举个栗子 代码优化 elif 栗子 执行顺序 情况一 情况二 情况三 if-elif-else特性 三种判断语句小结 if if-else if-elif-else 嵌套语句 if嵌套 栗子 执行顺序 相互嵌套 Tips Debug 总结 导入 在前面&#xff0c;我们学习了单向选择的if语句和多项…

超越α!PixArt家族新秀PixArt-Σ: 由弱到强训练的文本生成4K图像DiT(华为诺亚)

文章链接&#xff1a; https://arxiv.org/pdf/2403.04692 开源地址&#xff1a;https://pixart-alpha.github.io/PixArt-sigma-project/ PixArt-Σ&#xff0c;这是一个能够直接生成4K分辨率图像的Diffusion Transformer&#xff08;DiT&#xff09;。PixArt-Σ相比其前身PixAr…

【unity实战】3D水系统,游泳,潜水,钓鱼功能实现

最终效果 文章目录 最终效果素材将项目升级为URP画一个水潭地形材质升级为URP创建水调节水第一人称人物移动控制游泳水面停留添加水下后处理水下呼吸钓鱼参考完结 素材 https://assetstore.unity.com/packages/vfx/shaders/urp-stylized-water-shader-proto-series-187485 将…

06 数据结构之树

引言&#xff1a; 数的代码实现&#xff0c; 先序遍历、中序、后序、层次遍历 /* binary_tree.h */ #ifndef _BINARY_TREE_H #define _BINARY_TREE_H#include <stdio.h> #include <stdlib.h> #include <string.h>#define DEBUG(msg) \printf("--%s--, %…

【工作】如何写好一份工作自评/总结 述职报告

文章目录 一、述职与工作汇报1、述职是什么&#xff1f;2、述职的目标&#xff08;表扬/体谅/资源&#xff09;3、述职的对象&#xff08;挑战/规划/方法&#xff09; 二、如何做好一份述职报告1、述职内容2、述职PPT制作3、述职试讲练习 三、附工作自评 一、述职与工作汇报 1…

18个惊艳的可视化大屏(第21辑):环境监测与污染治理

hello&#xff0c;我是贝格前端工场老司机&#xff0c;这是第21期了&#xff0c;本次分享环境监测与污染治理场景下&#xff0c;可视化大屏的意义和案例&#xff0c;喜欢文章的别忘点赞关注&#xff0c;文章底部也有其他行业的案例。 可视化大屏在环境监测污染治理中发挥着重要…

【C++】list模拟实现list迭代器失效问题

list模拟实现&list迭代器失效问题 一&#xff0c;list模拟实现1. list的主要框架接口模拟2. list构造&拷贝构造&析构3. list迭代器3.1 普通迭代器3.2 const迭代器 4. 增删查改 二&#xff0c;迭代器失效问题1. list的迭代器失效原因2. 解决办法 一&#xff0c;list…

【动态规划】【前缀和】【和式变换】100216. K 个不相交子数组的最大能量值

本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode 100216. K 个不相交子数组的最大能量值 给你一个长度为 n 下标从 0 开始的整数数组 nums 和一个 正奇数 整数 k 。 x 个子数组的能量值定义为 stren…

九州金榜|孩子厌学的因素及解决办法

孩子在学习的过程中&#xff0c;遇到厌学这种情况非常容易见到&#xff0c;这也是孩子在成长的过程中经常遇到的烦恼。面对孩子的厌学&#xff0c;作为家长这时候不要慌乱&#xff0c;要做到分析孩子产生厌学的原因&#xff0c;在去寻找解决孩子厌学的办法。下面九州金榜家庭教…

C++单例模式、工厂模式

一、单例模式 (一) 什么是单例模式 1. 是什么&#xff1f; 在系统的整个生命周期内&#xff0c;一个类只允许存在一个实例。 2. 为什么&#xff1f; 两个原因&#xff1a; 节省资源。方便控制&#xff0c;在操作公共资源的场景时&#xff0c;避免了多个对象引起的复杂操作…

【Python】成功解决ModuleNotFoundError: No module named ‘seaborn’

【Python】成功解决ModuleNotFoundError: No module named ‘seaborn’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; …