力扣11.2

2742. 给墙壁刷油漆

给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time ,分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠:

  • 一位需要 付费 的油漆匠,刷第 i 堵墙需要花费 time[i] 单位的时间,开销为 cost[i] 单位的钱。
  • 一位 免费 的油漆匠,刷 任意 一堵墙的时间为 1 单位,开销为 0 。但是必须在付费油漆匠 工作 时,免费油漆匠才会工作。

请你返回刷完 n 堵墙最少开销为多少。

数据范围

  • 1 <= cost.length <= 500
  • cost.length == time.length
  • 1 <= cost[i] <= 106
  • 1 <= time[i] <= 500

分析1

参考灵神的题解
最初的dfs思想是dfs(i,j,k)表示要刷即将i+1-n的墙,当前付费时间为j,免费时间为k的最少开销,考虑dfs的边界条件

  • i f j − k > = n − i r e t u r n 0 if\ j-k>=n-i \ return \ 0 if jk>=ni return 0,即目前剩下的付费时间能够让剩下的墙都让免费油漆匠来刷
  • i f j > = n r e t u r n 0 x 3 f 3 f 3 f 3 f if \ j>=n \ return \ 0x3f3f3f3f if j>=n return 0x3f3f3f3f,所有的油漆匠都使用完,此时返回一个极大值,因为最后答案是取min,因此会忽略这个值

转移为

  • d f s ( i , j , k ) = m i n ( d f s ( i + 1 , j + t i m e [ i ] , k ) + c o s t [ i ] , d f s ( i + 1 , j , k + 1 ) ) dfs(i,j,k)=min(dfs(i+1,j+time[i],k)+cost[i],dfs(i+1,j,k+1)) dfs(i,j,k)=min(dfs(i+1,j+time[i],k)+cost[i],dfs(i+1,j,k+1))

但这样状态太多了,并且时间会超出,必须使用记忆化优化,我们考虑优化状态
我们发现每次比较的都是付费时间和免费时间的相对大小,因此可以将付费时间和免费时间合并为两者的差值

此时

  • d f s ( i , j ) = m i n ( d f s ( i + 1 , j + t i m e [ i ] ) + c o s t [ i ] , d f s ( i + 1 , j − 1 ) ) dfs(i,j)=min(dfs(i+1,j+time[i])+cost[i],dfs(i+1,j-1)) dfs(i,j)=min(dfs(i+1,j+time[i])+cost[i],dfs(i+1,j1))

边界条件为

  • i f j > = n − i r e t u r n 0 if\ j>=n-i \ return \ 0 if j>=ni return 0
  • i f j > = n r e t u r n 0 x 3 f 3 f 3 f 3 f if \ j>=n \ return \ 0x3f3f3f3f if j>=n return 0x3f3f3f3f

这里定义一个dp数组进行记忆化,注意dp的第二维由于是差,因此可能是负数,需要偏移n个单位

代码

class Solution {
public:const static int N = 505;int dp[N][2 * N]; int n;vector<int> cost, time;int dfs(int i, int j) { if(j >= n - i) return 0;if(i >= n) return 0x3f3f3f3f;int& res = dp[i][j + n];if(res != -1) return res;return res = min(dfs(i + 1, j + time[i]) + cost[i], dfs(i + 1, j - 1));}int paintWalls(vector<int>& cost1, vector<int>& time1) {cost = cost1;time = time1;n = cost.size();memset(dp, -1, sizeof(dp));return dfs(0, 0);}
};

分析2

参考灵神的题解
使用01背包进行分析,我们考虑什么时候能选择第i个付费粉刷匠,总墙数维j,需要满足,此时 付费个数 + 免费个数 = j 付费个数+免费个数=j 付费个数+免费个数=j

  • 前 i 个付费时间和 > = j − 前 i 个付费个数 前i个付费时间和>=j-前i个付费个数 i个付费时间和>=ji个付费个数

将前j个付费个数拆成1+1+1…的形式并移项
此时变成了

  • ∑ k = 0 i − 1 t i m e [ k ] + 1 ≥ j \sum_{k=0}^{i-1}time[k]+1 \ge j k=0i1time[k]+1j

这样就变成了【至少型】01背包问题,这题的价值为cost,体积为time,容量为总墙数,前i个物品,体积至少为j的价值为多少。

再使用滚动数组优化一下

代码

class Solution {
public:const static int N = 505;int dp[2 * N]; int n;int paintWalls(vector<int>& cost, vector<int>& time) {n = cost.size();memset(dp, 0x3f, sizeof(dp));dp[0] = 0;for(int i = 0; i < n; i ++ ) {  for(int j = n; j >= 0; j -- ) {int c = time[i] + 1;dp[j] = min(dp[j], dp[max(0, j - c)] + cost[i]);}}return dp[n];}
};

1449. 数位成本和为目标值的最大数字

给你一个整数数组 cost 和一个整数 target 。请你返回满足如下规则可以得到的 最大 整数:

  • 给当前结果添加一个数位(i + 1)的成本为 cost[i] (cost 数组下标从 0 开始)。
  • 总成本必须恰好等于 target 。
  • 添加的数位中没有数字 0 。

由于答案可能会很大,请你以字符串形式返回。

如果按照上述要求无法得到任何整数,请你返回 “0” 。

数据范围

  • cost.length == 9
  • 1 <= cost[i] <= 5000
  • 1 <= target <= 5000

分析

完全背包

代码

typedef long long LL;
class Solution {
public:const static int N = 5005;string dp[N];string max(string a, string b) {if(a[0] == '-') return b;else if(b[0] == '-') return a;if(a.size() > b.size()) return a;else if(a.size() < b.size()) return b;int na = a.size();for(int i = 0; i < na; i ++ ) {if(a[i] > b[i]) return a;else if(a[i] < b[i]) return b;}return a;}string largestNumber(vector<int>& cost, int target) {int n = cost.size();for(int i = 0; i <= target; i ++ ) {dp[i] = "-";}dp[0] = "";for(int i = n - 1; i >= 0; i -- ) {for(int j = cost[i]; j <= target; j ++ ) {string l = dp[j - cost[i]] + char((i + 1) + '0');dp[j] = max(dp[j], l);}}sort(dp[target].begin(), dp[target].end());if(dp[target][0] == '-') return "0";reverse(dp[target].begin(), dp[target].end());return dp[target];}
};

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

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

相关文章

[前端] 为网站侧边栏添加搜索引擎模块

前言 最近想给我的个人网站侧边栏添加一个搜索引擎模块&#xff0c;可以引导用户帮助本站SEO优化&#xff08;让用户可以通过点击搜索按钮完成一次对本人网站的搜索&#xff0c;从而实现对网站的搜索引擎优化&#xff09;。 最开始&#xff0c;我只是想实现一个简单的百度搜索…

nodejs入门教程20:nodejs文件系统

1. 引入fs模块 在Node.js中&#xff0c;你可以通过以下方式引入fs模块&#xff1a; const fs require(fs);2. 文件操作 读取文件 异步读取&#xff1a;使用fs.readFile()方法。该方法接收文件路径和回调函数作为参数&#xff0c;回调函数在文件读取完成后被调用。 fs.rea…

使用AWS Redshift从AWS MSK中读取数据

Amazon Redshift 流式摄取的目的是简化将流式数据直接从流式服务摄取到 Amazon Redshift 或 Amazon Redshift Serverless 的过程。 官方文档[1]中有详细步骤。用unauthenticated, IAM 的方式均可以进行连接&#xff0c;只不过使用的是不同端口&#xff1a;9092或者9098 [1] h…

2-3-4树的层序打印

234树 接前面0到100与B树比较0到50镜像代码更新随机测试后话接前面 红黑树转2-3-4树打印失败的地方。 0到100 这个是应该的样子 >>> rb = RBT() >>> for k in range(100):rb.INSERT(k) >>> t=tree234(rb.root) >>> t.print() 结点类型…

了解AIGC——文本生成技术在新闻媒体中的应用

了解AIGC&#xff1a;文本生成技术在新闻媒体中的应用 引言 生成式人工智能内容&#xff08;AI-Generated Content&#xff0c;简称AIGC&#xff09;在新闻媒体中的应用已经成为技术革新和内容创作的主要方向之一。新闻行业长期依赖于人类记者和编辑的创造力&#xff0c;而AI…

UBUNTU查看CPU核心数

UBUNTU查看CPU核心数 前言一、使用lscpu命令1. 执行命令2. 查看输出 二、使用/proc/cpuinfo文件1. 查看文件2. 解释输出 三、使用nproc命令1. 执行命令2. 查看输出 四、使用htop或top工具1. 使用htop2. 使用top 五、使用inxi命令1. 执行命令2. 查看输出 六、使用图形界面工具1.…

机器学习线性回归

文章目录 1.基本概念2.最小二乘法3.用代码来表示线性回归 1.基本概念 线性回归是一种统计方法&#xff0c;用于分析两个或多个变量之间的关系。其主要目的是通过建立一个线性模型来预测一个因变量&#xff08;或称为目标变量&#xff09;与一个或多个自变量&#xff08;或称为…

基于Openwrt系统架构,实现应用与驱动的实例。

一、在openwrt系统架构&#xff0c;编写helloworld的应用程序。 第一步先创建目录&#xff0c;项目代码要放在 openwrt根目下的 package 目录中&#xff0c;这里源码写在了 hellworld 的 src 目录下&#xff0c;因为外层还有需要编写的文件。 mkdir -p ~/openwrt/package/hel…

C++ STL 学习指南:带你快速掌握标准模板库

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 大家好呀&#xff01;&#x1f917; 今天我们来聊一聊 C 程序员的必备神器——STL&#xff08;Standard Template Library&#xf…

牛客练习赛131 (待补

A 小H学语文 &#xff08;贪心&#xff09; 题意&#xff1a;给定n个木板&#xff0c;1~n长度为h[i]&#xff0c;选则m块木板&#xff0c;使m*m*h(min) 最大 思路&#xff1a;贪心的&#xff08;将木板降序排列后&#xff09;从n到1&#xff08;越多越好&#xff09;枚举木板…

挑战Java面试题复习第5天,无人扶我青云志

挑战第 5 天 java反射List Set Map 区别Object 常用方法 java反射 定义&#xff1a; 运行时动态获取类信息和调用方法的特性。 应用场景&#xff1a; JDBC数据库连接。框架如Hibernate和Struts等。 实现方式&#xff1a; 通过四种方法获取Class对象&#xff1a; Class.fo…

Oracle视频基础1.3.5练习

Oracle视频基础1.3.4练习 1.3.5 检查数据库启动状态 ps -ef | grep oracle ipcs clear演示alter向前向后改database阶段 sqlplus /nolog conn / as sysdba startup mount alter database nomount # 报错 alter database open启动restricted mode&#xff0c;创建一个connect&…

Unity3D包管理bug某些版本Fbx Exporter插件无法搜索到的问题

这个问题是在使用unity的时候发现的 有些版本里没有Fbx Exporter插件也是没法搜到 经过测试&#xff0c;在package manager中开启Enable Preview Packages也没有用 这个插件在2020已经是正式版了&#xff0c;不需要再开启 后来发现可能是版本bug 需要手动开启 在工程的Pac…

深度学习-学习率调整策略

在深度学习中&#xff0c;学习率调整策略&#xff08;Learning Rate Scheduling&#xff09;用于在训练过程中动态调整学习率&#xff0c;以实现更快的收敛和更好的模型性能。选择合适的学习率策略可以避免模型陷入局部最优、震荡不稳定等问题。下面介绍一些常见的学习率调整策…

【MogDB】MogDB5.2.0重磅发布第五篇-支持部分ORACLE的HINT

一、背景 ORACLE的SQL优化器非常强大&#xff0c;但是仍然会在某些情况下&#xff0c;ORACLE自动生成的执行计划并不是很好&#xff0c;此时可以通过在SQL中增加HINT来人工控制执行计划应该怎么走。在ORACLE迁移到国产库的过程中&#xff0c;由于部分国产库并不支持ORACLE的HI…

U盘引导丢失问题的处理办法

项目背景&#xff1a;在使用自制的u盘系统的时候经常遇到引导丢失的问题&#xff0c;那么咱们怎么解决这个问题呢&#xff0c;首先第一步通过手动引导u盘 进入系统&#xff0c;同时再进行引导区的修复这样u盘系统就可以正常工作了。 1 进入grub 的提示符下面&#xff0c;首先…

Caffeine 手动策略缓存 put() 方法源码解析

BoundedLocalManualCache put() 方法源码解析 先看一下BoundedLocalManualCache的类图 com.github.benmanes.caffeine.cache.BoundedLocalCache中定义的BoundedLocalManualCache静态内部类。 static class BoundedLocalManualCache<K, V> implements LocalManualCache&…

树莓派开发相关知识四 传感器-测距C语言版本

1、封装调用函数 #include <stdio.h> #include <time.h> #include "wiringPi.h"void initmode(int trig,int echo) {wiringPiSetupGpio();pinMode(trig,OUTPUT);digitalWrite(trig,LOW);pinMode(echo,INPUT); }double get_distance(int trig,int echo) …

《Qwen2-VL》论文精读【上】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当

1、论文地址Qwen2-VL: Enhancing Vision-Language Model’s Perception of the World at Any Resolution 2、Qwen2-VL的Github仓库地址 该论文发表于2024年4月&#xff0c;是Qwen2-VL的续作&#xff0c;截止2024年11月&#xff0c;引用数24 文章目录 1 论文摘要2 引言3 实验3.…

StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 目录 1.前言 2.线程池基础知识回顾 2.1.线程池的组成 2.2.工作流程 2…