【动态规划】【C++算法】2742. 给墙壁刷油漆

news2025/1/24 8:41:31

作者推荐

【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字

本文涉及知识点

动态规划汇总

LeetCode2742. 给墙壁刷油漆

给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time ,分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠:
一位需要 付费 的油漆匠,刷第 i 堵墙需要花费 time[i] 单位的时间,开销为 cost[i] 单位的钱。
一位 免费 的油漆匠,刷 任意 一堵墙的时间为 1 单位,开销为 0 。但是必须在付费油漆匠 工作 时,免费油漆匠才会工作。
请你返回刷完 n 堵墙最少开销为多少。
示例 1:
输入:cost = [1,2,3,2], time = [1,2,3,2]
输出:3
解释:下标为 0 和 1 的墙由付费油漆匠来刷,需要 3 单位时间。同时,免费油漆匠刷下标为 2 和 3 的墙,需要 2 单位时间,开销为 0 。总开销为 1 + 2 = 3 。
示例 2:
输入:cost = [2,3,4,2], time = [1,1,1,1]
输出:4
解释:下标为 0 和 3 的墙由付费油漆匠来刷,需要 2 单位时间。同时,免费油漆匠刷下标为 1 和 2 的墙,需要 2 单位时间,开销为 0 。总开销为 2 + 2 = 4 。
提示:
1 <= cost.length <= 500
cost.length == time.length
1 <= cost[i] <= 106
1 <= time[i] <= 500

动态规划

动态规划的状态表示

合法状态:付费工人用时大于等于免费工人用时。
注意:第i项工作,付费工人需要time[i]时间,免费工人需要1。所以前i项工作,付费工人用时和免费工人用时之和不固定。
免费工人用时 ∈ \in [0,500],付费工人用时大于等于500,必定可行,所以付费用时用时也 ∈ \in [0,500]。
如果直接暴力处理,空间复杂度:O(n2),处理每份工作时间复杂度O(n),总时间复杂度O(n3)超时。
状态优化
付费工人用时>=免费工人用时    ⟺    \iff 付费工人用时 - 免费工人用时 >=0
付费工人用时 - 免费工人用时 ∈ \in [-500,500] 为了方便可以加上500,变成 ∈ \in [0,100don0]
空间复杂度变成:O(n) 总时间复杂度:O(nn)。

动态规划的转移方程

{ d p [ m i n ( 1000 , j + c o s t [ i ] ) ] = m i n ( , p r e [ j ] + c o s t [ i ] ) 使用付费工人 d p [ j − 1 ] = m i n ( , p r e [ j ] ) \begin{cases} dp[min(1000,j+cost[i])] = min(,pre[j]+cost[i]) & 使用付费工人 \\ dp[j-1] = min(,pre[j]) & \\ \end{cases} {dp[min(1000,j+cost[i])]=min(,pre[j]+cost[i])dp[j1]=min(,pre[j])使用付费工人

动态规划的初始值

dp[500]= 0

动态规划的填表顺序

依次处理各任务。

动态规划返回值

dp[500,1000]的最大值。

代码

核心代码

template<class ELE,class ELE2>
void MinSelf(ELE* seft, const ELE2& other)
{
	*seft = min(*seft,(ELE) other);
}

template<class ELE>
void MaxSelf(ELE* seft, const ELE& other)
{
	*seft = max(*seft, other);
}

class Solution {
public:
	int paintWalls(vector<int>& cost, vector<int>& time) {
		int n = cost.size();
		vector<int> pre(n * 2 + 1, m_iNotMay);
		pre[n] = 0;
		for (int i = 0; i < cost.size(); i++)
		{
			vector<int> dp(n * 2 + 1, m_iNotMay);
			for (int j = 0; j <= n * 2; j++)
			{
				if (pre[j] >= m_iNotMay)
				{
					continue;
				}
				MinSelf(&dp[min(2 * n, j + time[i])], pre[j] + cost[i]);
				MinSelf(&dp[j - 1], pre[j]);
			}
			pre.swap(dp);
		}
		return *std::min_element(pre.begin() + n, pre.end());
	}
	const int m_iNotMay = 1e9;
};

测试用例


template<class T,class T2>
void Assert(const T& t1, const T2& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}

}

int main()
{	
	int n;
	vector<int> cost,  time;
	{
		Solution sln;
		cost = { 1, 2, 3, 2 }, time = { 1, 2, 3, 2 };
		auto res = sln.paintWalls(cost, time);
		Assert(res,3);
	}

	{
		Solution sln;
		cost = { 2, 3, 4, 2 }, time = { 1, 1, 1, 1 };
		auto res = sln.paintWalls(cost, time);
		Assert(res, 4);
	}
	
}

2023年6月

class Solution {
public:
int paintWalls(vector& cost, vector& time) {
m_c = cost.size();
vector< int> preTimeAddNumToMinCost(m_c+1,INT_MAX);
preTimeAddNumToMinCost[0] = 0;
for (int ii = 0; ii < m_c; ii++)
{
vector< int> dp = preTimeAddNumToMinCost;
for (int j = 0; j < m_c; j++ )
{
if (INT_MAX == preTimeAddNumToMinCost[j])
{
continue;
}
int iTimeAndNum = j + time[ii] + 1 ;
const int iCurCost = preTimeAddNumToMinCost[j] + cost[ii];
iTimeAndNum = min(iTimeAndNum, m_c);
dp[iTimeAndNum] = min(dp[iTimeAndNum], iCurCost);
}
dp.swap(preTimeAddNumToMinCost);
}
return preTimeAddNumToMinCost[m_c];
}
int m_c;

};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

多行重定向,expect,字符串处理,高级变量,脚本工具

一&#xff0c;多行重定向 &#xff08;一&#xff09;含义 使用I/O重定向的方式将命令列表提供给交互式程序 标准输入的一种替代品 Here Document 是标准输 入的一种替代品&#xff0c;可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是直接就地 生产出…

Unity类银河恶魔城学习记录7-6 P72 Bouncy sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Colle…

Github 2024-02-18 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-18统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5PowerShell项目1Rust项目1PHP项目1Jupyter Notebook项目1TypeScript项目1 Black&#xff1a;不妥…

力扣51. N 皇后(回溯)

Problem: 51. N 皇后 文章目录 题目描述思路解决方法复杂度Code 题目描述 思路 1.决策路径&#xff1a;board中小于row的那些行都已经成功放置了皇后&#xff1b; 2.选择列表&#xff1a;第row行的所有列都是放置皇后的选择&#xff08;则根据N皇后相互攻击的股则编写判断当前决…

JVM常见问题笔记分享

文章目录 1 JVM组成1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;1.2 什么是程序计数器&#xff1f;1.3 你能给我详细的介绍Java堆吗?元空间(MetaSpace)介绍 1.4 什么是虚拟机栈1.5 堆和栈的区别1.6 能不能解释一下方法区&#xff1f;1.5.1 概述1.5.2 常量池1…

鸿蒙应用模型开发-更新SDK后报错解决

更新SDK后提示 “ohos.application.Ability”/“ohos.application.AbilityStage”等模块找不到或者无相关类型声明 问题现象 更新SDK后报错“Cannot find module ‘ohos.application.AbilityStage’ or its corresponding type declarations”&#xff0c;“Cannot find modu…

【springboot+vue项目(十五)】基于Oauth2的SSO单点登录(二)vue-element-admin框架改造整合Oauth2.0

Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架&#xff0c;提供了丰富的组件和功能&#xff0c;可以帮助开发者快速搭建现代化的后台管理系统。 一、基本知识 &#xff08;一&#xff09;Vue-element-admin 的主要文件和目录 vue-element-admin/ |…

裁员不可怕,可怕的是软件测试行业在发生巨变,而你却原地踏步

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Android Studio 的 Gradle Task 没有显示

问题 Android Studio 的 Gradle Task 没有显示 详细问题 笔者需要获取android应用MD5&#xff0c;一种方法是 但是笔者的Android Studio 的 Gradle Task 没有显示 解决方案 依次点击&#xff1a;File -> Settings -> Experimental -> 取消勾选 “Do not build …

轻松采集商品 全称免滑块 精准实时数据采集|全平台电商API接口

随着电子商务的快速发展&#xff0c;越来越多的商家和消费者选择在淘宝上进行交易。 淘宝商品详情API接口轻松采集淘宝上的商品信息&#xff0c;全程免滑块&#xff0c;实现精准实时数据采集。 一、采集商品信息 商品详情API接口采用先进的爬虫技术&#xff0c;能够快速准确…

Python学习路线图

防止忘记&#xff0c;温故知新 进阶路线

医学超声模式简介

B模式 B是英文单词“亮度”&#xff08;Brightness&#xff09;的第一个字母&#xff0c;因为被观察结构的回声或亮度取决于反射信号的强度&#xff0c;它用平面图形的形式来显示被探查组织的具体情况。检查时&#xff0c;首先将人体界面的反射信号转变为强弱不同的光点&#x…

Python实现时间序列分析使用LOESS(STL)模型进行季节性趋势分解(STL算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 时间序列分析中&#xff0c;LOESS&#xff08;局部加权回归平滑&#xff09;和STL&#xff08;Seasona…

Python第十七章(面向对象总结)

一。面向对象三大特征 1.封装&#xff1a;将属性和方法写到类里面&#xff0c;且可以添加私有属性和方法 2.继承&#xff1a;子类默认继承父类的所有属性和方法&#xff0c;子类可以重写父类的属性和方法 3.多态&#xff1a;传入不同的对象&#xff0c;产生不同的结果 二。多…

用连续自然数之和来表达整数

文章目录 题目描述&#xff1a;用连续自然数之和来表达整数输入描述输出描述用例1说明用例2代码运行举例注意&#xff1a;1、sprintf 和 strcat区别2、qsort 题目描述&#xff1a;用连续自然数之和来表达整数 一个整数可以由连续的自然数之和来表示。 给定一个整数&#xff0c…

鸿蒙语言ArkTS(更好的生产力与性能)

ArkTS是鸿蒙生态的应用开发语言 ArkTS提供了声明式UI范式、状态管理支持等相应的能力&#xff0c;让开发者可以以更简洁、更自然的方式开发应用。 同时&#xff0c;它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;进一步通过规范强化静态检…

自动驾驶中的 DCU、MCU、MPU、SOC 和汽车电子架构

自动驾驶中的 DCU、MCU、MPU 1. 分布式电子电气架构2. 域集中电子电气架构架构2.1 通用硬件定义 3. 车辆集中电子电气架构4. ADAS/AD系统方案演变进程梳理4.1 L0-L2级别的ADAS方案4.2 L2以上级别的ADAS方案 5. MCU和MPU区别5.1 MCU和MPU的区别5.2 CPU与SoC的区别5.3 举个例子 R…

陶建国教授谈中西方文化的差异与交融

龙年到来&#xff0c;这个春节里&#xff0c;“龙”字的英文翻译引发关注&#xff0c;冲上了热搜&#xff0c;网友发现&#xff0c;“龙”不再翻译为“dragon”&#xff0c;而是龙字的谐音“loong”。原来&#xff0c;在西方人的眼里&#xff0c;龙是凶猛的怪兽&#xff0c;具有…

Spring 事务原理总结六

不知不觉&#xff0c;关于Spring事务的文章已经写了五篇了。老实讲我自己不断质疑过自己&#xff1a;现在写这些文章还有意义吗&#xff1f;当前的市场已经成什么样了&#xff0c;为什么还要固守这落后的技术&#xff1f;但是贝索斯一次接受访谈的回答&#xff0c;让我写下去的…

抖店退货率太高,2024年没办法继续做了?买家市场下只能这样做

我是王路飞。 之前接到一位粉丝朋友的私信&#xff0c;说是自己做抖店也有段时间了&#xff0c;但现在没之前好做了。 一方面是行业内卷&#xff0c;自己做的无货源模式&#xff0c;没什么优势&#xff0c;利润太低了&#xff1b; 另一方面就是现在抖店的退货问题太严重了&a…