当前位置: 首页 > news >正文

动态规划问题 -- 多状态模型(粉刷房子)

目录

  • 动态规划分析问题五步曲
  • 题目概述
  • 代码编写

动态规划分析问题五步曲

不清楚动态规划分析问题是哪关键的五步的少年们可以移步到
链接: 动态规划算法基础
这篇文章非常详细的介绍了动态规划算法是如何分析和解决问题的

题目概述

链接: 粉刷房子
在这里插入图片描述

  1. 状态表示(题目要求+自己的经验)
    本题状态:分析第i个位置,发现第i个位置可以选择红色,蓝色和绿色
    显然,一个状态表示是不够的得分类讨论
    red[i] : 表示i个位置粉刷为红色的最小花费
    blue[i] : 表示i个位置粉刷为蓝色的最小花费
    green[i] : 表示i个位置粉刷为绿色的最小花费
  1. 状态转移方程推导
    对i位置进行分类讨论,若i位置一直颜色,则其他i-1的颜色坑定为 其他两种颜色的一种
    轻松得出状态转移方程
    在这里插入图片描述
  1. 初始化(防止越界+结合状态表示初始化)
    根据状态转移方程,当i = 0时会发生越界
    根据状态表示 :
    初始化令red = cost[0][0] , blue = cost[0][1] , green = cost[0][2];
  1. 填表顺序(分析要填i位置前一个依赖状态的位置)
    本题三个dp表显然都是从左到右填表
  1. 返回值(由题目要求来)
    因此我们并不确定最终位置会染成什么颜色,又根据三个表的状态表示
    只需要返回 三者的最小值即可

代码编写

有了动态规划五步曲我们就可以写出非常优雅的代码了

  int minCost(vector<vector<int>>& costs) {int n = costs.size();vector<int> red(n);auto blue = red , green = red;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]));}

少年,今天你又进步了一点点哟,明天继续加油吧
在这里插入图片描述

相关文章:

  • Milvus 全面解析
  • python 练习 五
  • 深入理解Java HotSpot中的即时编译
  • PADS入门笔记【一】
  • 【Python】对象生命周期全解析
  • Vue 3 打开 el-dialog 时使 el-input 获取焦点
  • 使用大语言模型从零构建知识图谱(上)
  • Linux 内核 IPv4 协议栈中的协议注册机制解析
  • QT---信号与槽
  • Qt操作SQLite数据库教程
  • AI Agent开发第66课-彻底消除RAG知识库幻觉-带推理的RAG
  • 3D Gaussian Splatting 查看工具 splatviz
  • 建筑物渗水漏水痕迹发霉潮湿分割数据集labelme格式1357张1类别
  • vue和springboot交互数据,使用axios【跨域问题】
  • 论系统安全架构设计及其应用~系统架构师论文
  • Ros2 - Moveit2 - DeepGrasp(深度抓握)
  • Open3D 体素化下采样
  • Python面向对象编程精解:从两大编程范式到类与对象实战
  • 前后端分离博客 Weblog 项目实战
  • 启动窗体自动输入上次内容——CAD c#二次开发
  • 北方产粮大省遭遇气象干旱,夏粮用水如何解决?
  • 缅甸内观冥想的历史漂流:从心理治疗室到“非语言现场”
  • 夜读丨读《汉书》一得
  • 国务院关税税则委员会关于调整对原产于美国的进口商品加征关税措施的公告
  • 外交部亚洲司司长刘劲松会见印度驻华大使罗国栋
  • 成都锦江区一在建工地起火,致2人遇难1人受伤