力扣10.19

3192. 使二进制数组全部等于 1 的最少操作次数 II

给你一个二进制数组 nums 。

你可以对数组执行以下操作 任意 次(也可以 0 次):

选择数组中 任意 一个下标 i ,并将从下标 i 开始一直到数组末尾 所有 元素 反转 。
反转 一个元素指的是将它的值从 0 变 1 ,或者从 1 变 0 。

请你返回将 nums 中所有元素变为 1 的 最少 操作次数。

数据范围

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 1

分析

考虑10110这个元素,要使下标为[2:]的元素均为1,必须得先把[3:]的元素变为0,因此考虑从尾向头遍历,若当前位置为1且不是首部,则反转它和后面的,若当前位置为0,也进行翻转

代码

class Solution {
public:int minOperations(vector<int>& nums) {int n = nums.size();int res = 0;for(int i = n - 1; i >= 0; i -- ) {int j = i;while(j >= 0) {if(nums[j] == nums[i]) j -- ;else break;}i = j + 1;if(nums[i] == 1 && i != 0) res ++ ;else if(nums[i] == 0) res ++ ;  }return res;}
};

741. 摘樱桃

给你一个 n x n 的网格 grid ,代表一块樱桃地,每个格子由以下三种数字的一种来表示:

  • 0 表示这个格子是空的,所以你可以穿过它。

  • 1 表示这个格子里装着一个樱桃,你可以摘到樱桃然后穿过它。

  • -1 表示这个格子里有荆棘,挡着你的路。
    请你统计并返回:在遵守下列规则的情况下,能摘到的最多樱桃数:

  • 从位置 (0, 0) 出发,最后到达 (n - 1, n - 1) ,只能向下或向右走,并且只能穿越有效的格子(即只可以穿过值为 0 或者 1 的格子);

  • 当到达 (n - 1, n - 1) 后,你要继续走,直到返回到 (0, 0) ,只能向上或向左走,并且只能穿越有效的格子;

  • 当你经过一个格子且这个格子包含一个樱桃时,你将摘到樱桃并且这个格子会变成空的(值变为 0 );

  • 如果在 (0, 0) 和 (n - 1, n - 1) 之间不存在一条可经过的路径,则无法摘到任何一个樱桃。

数据范围

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 50
  • grid[i][j] 为 -1、0 或 1
  • grid[0][0] != -1
  • grid[n - 1][n - 1] != -1

分析

( 0 , 0 ) (0,0) (0,0)出发到 ( n − 1 , n − 1 ) (n-1,n-1) (n1,n1)再返回 ( 0 , 0 ) (0,0) (0,0),可以相当于从两个机器人同时从(0,0)出发到达 ( n − 1 , n − 1 ) (n-1,n-1) (n1,n1),观察一下数据范围,只有50,因此可以直接将两个机器人的状态作为dp,令 d p [ x 1 ] [ y 1 ] [ x 2 ] [ y 2 ] dp[x1][y1][x2][y2] dp[x1][y1][x2][y2]表示机器人1和2分别位于 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x1,y1),(x2,y2) (x1,y1),(x2,y2)时收集的樱桃总和,使用记忆化搜索的方式会更加简单

  • d f s ( x 1 , y 1 , x 2 , y 2 ) = m a x ( d f s ( x 1 , y 1 − 1 , x 2 , y 2 − 1 ) , d f s ( x 1 , y 1 − 1 , x 2 − 1 , y 2 ) , d f s ( x 1 − 1 , y 1 , x 2 − 1 , y 2 ) , d f s ( x 1 − 1 , y 1 , x 2 , y 2 − 1 ) + c dfs(x1,y1,x2,y2)=max(dfs(x1,y1-1,x2,y2-1), dfs(x1,y1-1,x2-1,y2), dfs(x1-1,y1,x2-1,y2), dfs(x1-1,y1,x2,y2-1)+c dfs(x1,y1,x2,y2)=max(dfs(x1,y11,x2,y21),dfs(x1,y11,x21,y2),dfs(x11,y1,x21,y2),dfs(x11,y1,x2,y21)+c,c为这次当前位置两个机器人收获的樱桃

代码

class Solution {
public:const static int N = 55;int dp[N][N][N][N];int dx[2] = {0, 1};int dy[2] = {1, 0};int n, m;int dfs(int x1, int y1, int x2, int y2, vector<vector<int>>& grid) {if(x1 == n - 1 && y1 == m - 1 && x2 == n - 1 && y2 == m - 1) return grid[x1][y1];if(x1 < 0 || x2 < 0 || x1 >= n || x2 >= n || y1 < 0 || y2 < 0 || y1 >= m || y2 >= m) return -0x3f3f3f3f;if(grid[x1][y1] == -1 || grid[x2][y2] == -1) return -0x3f3f3f3f;int& t = dp[x1][y1][x2][y2];if(t != -1) return t;t = 0;int c;if(x1 == x2 && y1 == y2) c = grid[x1][y1];else c = grid[x1][y1] + grid[x2][y2];int tmpt = -0x3f3f3f3f;for(int i = 0; i < 2; i ++ ) {for(int j = 0; j < 2; j ++ ) {tmpt = max(tmpt, dfs(x1 + dx[i], y1 + dy[i], x2 + dx[j], y2 + dy[j], grid));}}t = tmpt + c;return t;}int cherryPickup(vector<vector<int>>& grid) {n = grid.size();m = grid[0].size();memset(dp, -1, sizeof(dp));int res = dfs(0, 0, 0, 0, grid);if(res < 0) return 0;return res;}
};

2915. 和为目标值的最长子序列的长度

给你一个下标从 0 开始的整数数组 nums 和一个整数 target 。

返回和为 target 的 nums 子序列中,子序列 长度的最大值 。如果不存在和为 target 的子序列,返回 -1 。

子序列 指的是从原数组中删除一些或者不删除任何元素后,剩余元素保持原来的顺序构成的数组。

数据范围

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 1000
  • 1 <= target <= 1000

分析

01背包,将每个数的价值看作是1,背包容量为target,令dp[i][j]为前i个数容量正好为j是的长度,这道题和普通01背包不同就在于需要正好是j,因此需要将其他的不合法状态设置为一个极小值,其他就按照正常01背包套路来写,然后可以利用轮动数组优化一下

代码

class Solution {
public:const static int N = 1005;int dp[N];int lengthOfLongestSubsequence(vector<int>& nums, int target) {int n = nums.size();memset(dp, -0x3f, sizeof(dp));dp[0] = 0;for(int i = 0; i < n; i ++ ) {for(int j = target; j >= nums[i]; j -- ) {dp[j] = max(dp[j], dp[j - nums[i]] + 1);}}return dp[target] < 0 ? -1 : dp[target];}
};

2787. 将一个数字表示成幂的和的方案数

给你两个 正 整数 nx

请你返回将 n 表示成一些 互不相同 正整数的 x 次幂之和的方案数。换句话说,你需要返回互不相同整数 [n1, n2, ..., nk] 的集合数目,满足 n = n1x + n2x + ... + nkx

由于答案可能非常大,请你将它对 109 + 7 取余后返回。

比方说,n = 160x = 3,一个表示 n 的方法是 n = 23 + 33 + 53

数据范围

  • 1 <= n <= 300
  • 1 <= x <= 5

分析

令dp[i][j]为前i个数的x次方里,满足总和为j的方案数,由于n最大为300,因此快速幂处理i的x次方时可以将超过300的部分返回301,接下来是状态转移

  • d p [ i ] [ j ] + = d p [ i − 1 ] [ j ] + d p [ i − 1 ] [ j − q p o w ( i , x ) ] dp[i][j]+=dp[i-1][j]+dp[i-1][j-qpow(i,x)] dp[i][j]+=dp[i1][j]+dp[i1][jqpow(i,x)]
    同样这题可以通过滚动数组进行优化

代码

typedef long long LL;
class Solution {
public:const static int N = 305, mod = 1e9 + 7;int dp[N];LL qpow(LL a, LL n) {LL res = 1;while(n) {if(res > 300 || a  > 300) return 301;if(n & 1) res = res * a;a = a * a;n >>= 1;}return res;}int numberOfWays(int n, int x) {dp[0] = 1;for(int i = 1; i <= n; i ++ ) {for(int j = n; j >= qpow(i, x); j -- ) {dp[j] += dp[j - qpow(i,x)];dp[j] %= mod;}}return dp[n];}
};

3180. 执行操作可获得的最大总奖励 I

给你一个整数数组 rewardValues,长度为 n,代表奖励的值。

最初,你的总奖励 x0,所有下标都是 未标记 的。你可以执行以下操作 任意次 :

  • 从区间 [0, n - 1] 中选择一个 未标记 的下标 i。
  • 如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i] 加到 x 上(即x = x + rewardValues[i]),并 标记 下标 i。
    以整数形式返回执行最优操作能够获得的 最大 总奖励。

数据范围

  • 1 <= rewardValues.length <= 2000
  • 1 <= rewardValues[i] <= 2000

分析

  • 首先,若先选最大的数,那就选不了小的数,因此贪心的思路肯定是从小往大选,先排序

  • 考虑最大的值会不会选,假如不选,则将选的最大值替换为全局最大值一定会更优,因此最大值一定被选,假设最大值为k,则前 n − 1 n-1 n1个物品就构成了01背包问题。

  • 接下来考虑背包容量,体积和价值分别是什么,首先,要想装下最后一个数k,因此前面的价值之和不能超过 k − 1 k-1 k1,因此背包容量为 k − 1 k-1 k1体积和价值都为数的大小

  • 接下来考虑状态定义,令dp[i][j]为前i个数,总体积不超过j时价值的最大值

  • 然后是状态转移,对前n-1个数进行01背包,但这里需要注意,原始的01背包是 d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w ] + v ) dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v) dp[i][j]=max(dp[i1][j],dp[i1][jw]+v),即分为选或不选两种情况,若选则从上一个状态j-w转移过来,但这题有限制, d p [ i − 1 ] [ j − w ] dp[i-1][j-w] dp[i1][jw]的价值不一定比w小,因此状态转移暂定如下

    • d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ c ] + w ) dp[i][j]=max(dp[i-1][j],dp[i-1][c]+w) dp[i][j]=max(dp[i1][j],dp[i1][c]+w)
  • 接下来考虑 c c c的取值,首先,本体价值和体积相同,因此对于状态 d p [ i ] [ w ] dp[i][w] dp[i][w],其价值v必然不会大于 w w w,考虑到这一点,上一个状态 j − w j-w jw的价值也不会大于 j − w j-w jw,因此对 j − w j-w jw进行讨论

    • j − w > = w j-w>=w jw>=w,此时 c c c w − 1 w-1 w1,因为最大不能取j-w
    • j − w < w j-w<w jw<w,此时 c c c j − w j-w jw
  • 最终答案为 d p [ n − 1 ] [ k − 1 ] + k dp[n-1][k-1]+k dp[n1][k1]+k
    同样这题可以用滚动数组进行优化
    下面的代码1为没有空间优化的代码,代码2进行轮动数组优化

代码1

class Solution {
public:const static int N = 2005;int dp[N][N];int maxTotalReward(vector<int>& rewardValues) {int n = rewardValues.size();sort(rewardValues.begin(), rewardValues.end());int t = rewardValues.back();for(int i = 0; i < n - 1; i ++ ) {for(int j = 0; j < t; j ++ ) {dp[i + 1][j] = dp[i][j];if(j >= rewardValues[i]) {int c;if(j - rewardValues[i] >= rewardValues[i]) c = rewardValues[i] - 1;else c = j - rewardValues[i];dp[i + 1][j] = max(dp[i][j], dp[i][c] + rewardValues[i]);}}}return dp[n - 1][t - 1] + t;}
};

代码2

class Solution {
public:const static int N = 2005;int dp[N];int maxTotalReward(vector<int>& rewardValues) {int n = rewardValues.size();sort(rewardValues.begin(), rewardValues.end());int t = rewardValues.back();for(int i = 0; i < n - 1; i ++ ) {for(int j = t - 1; j >= rewardValues[i]; j -- ) {int c;if(j - rewardValues[i] >= rewardValues[i]) c = rewardValues[i] - 1;else c = j - rewardValues[i];dp[j] = max(dp[j], dp[c] + rewardValues[i]);}}return dp[t - 1] + t;}
};

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

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

相关文章

HCIP-HarmonyOS Application Developer 习题(十四)

&#xff08;多选&#xff09;1、HarmonyOs为应用提供丰富的Al(Artificial Intelligence)能力&#xff0c;支持开箱即用。下列哪些是它拥有的AI能力? A、通用文字识别 B、词性标注 C、实体识别 D、语音播报 答案&#xff1a;ABCD 分析&#xff1a; AI能力简介二维码生成根据开…

Docker 拉取镜像时配置可用镜像源(包含国内可用镜像源)

在/etc/docker/daemon.json中写入如下内容(如果文件不存在请新建该文件)&#xff1a; { "registry-mirrors":["https://registry.docker-cn.com"] } 重新加载 json 配置文件&#xff1a; sudo systemctl daemon-reload重启 docker 服务&#xff1a; sud…

(JAVA)贪心算法、加权有向图与求得最短路径的基本论述与实现

1. 贪心算法 1.1 贪心算法的概述&#xff1a; 贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。 贪心算法的特点是一步一步地进行&#xff0c;常以当前情况为基础根据某个优化测度作最优选择&#xff0c;而不考虑各种可能的整体情况&#xff0c;省去了为找最优…

Python自动化发票处理:使用Pytesseract和Pandas从图像中提取信息并保存到Excel

1. 引言 在财务部门&#xff0c;处理大量的纸质或扫描版发票是一项既耗时又容易出错的任务。通过使用Python中的pytesseract&#xff08;一个OCR工具&#xff09;和pandas库&#xff0c;我们可以自动化这一过程&#xff0c;从而提高工作效率并减少错误。 2. 安装所需库 首先…

Spring基于底层 API 的编程式管理和基于 TransactionTemplate 的编程式事务管理

在 Spring 中&#xff0c;事务管理可以通过编程式方式实现&#xff0c;主要有两种方式&#xff1a;基于底层 API 的编程式管理和基于 TransactionTemplate 的编程式事务管理。以下是两种方式的示例&#xff1a; 1. 基于底层 API 的编程式事务管理 这种方式直接使用 Spring 提…

Python 函数详解

引言 函数是编程中非常重要的概念&#xff0c;它允许我们将代码组织成可重用的块。Python 提供了灵活且强大的函数功能&#xff0c;包括创建和调用函数、形式参数与实际参数、位置参数、关键字参数、默认参数值、可变参数、返回值、变量作用域以及匿名函数&#xff08;lambda&…

Linux 配置 ssh —— ubuntu

Linux 配置 ssh —— ubuntu 设置 ip 这里我们选择使用系统 DHCP 自动分配的 IP&#xff0c;有些教程推荐使用自定义 IP&#xff0c;但是这样我们就没法上网&#xff0c;所有这里采用自定义 IP 即可 安装并启动 ssh 首先需要安装 ssh&#xff1a; sudo apt-get install op…

【深度学习中的注意力机制6】11种主流注意力机制112个创新研究paper+代码——加性注意力(Additive Attention)

【深度学习中的注意力机制6】11种主流注意力机制112个创新研究paper代码——加性注意力&#xff08;Additive Attention&#xff09; 【深度学习中的注意力机制6】11种主流注意力机制112个创新研究paper代码——加性注意力&#xff08;Additive Attention&#xff09; 文章目录…

修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)

@[TOC](修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)) 对于MySQL的漏洞问题,建议通过防火墙来限制远程访问本地3306端口的方式来处理。如果必须要升级,那么涉及到的具体兼容性问题,新版本安装后会导致的业务异常。 所以,建议采用增加防火墙策略的方式,不建议对mysql进…

计算PSNR, SSIM, VAMF工具

计算PSNR, SSIM, VAMF GitHub - fifonik/FFMetrics: Visualizes Video Quality Metrics (PSNR, SSIM & VMAF) calculated by ffmpeg.exe 绘制码率图 GitHub - fifonik/FFBitrateViewer: Visualizes video bitrate received by ffprobe.exe 视频对比 https://github.com/…

什么是全局污染?怎么避免全局污染?

全局污染&#xff08;Global Pollution&#xff09;是指在编程过程中&#xff0c;过度使用全局变量或对象导致命名冲突、代码可维护性下降及潜在错误增加的问题。在 JavaScript 等动态语言中&#xff0c;尤其需要关注全局污染的风险。 全局污染的影响 1. 命名冲突 3. 意外修改…

【C#】调用本机AI大模型流式返回

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_python ai流式返回-CSDN博客 前两章节我们讲解了使用AI Navigator软件搭建本机大模型&#xff0c;并使用python对大模型api进行调用&#xff0c;使其流式返…

Python Flask 框架下的 API 接口开发与封装示例

API&#xff08;Application Programming Interface&#xff09;接口的开发和封装是构建软件系统的重要环节。以下是关于 API 接口开发和封装的详细步骤&#xff1a; 一、需求分析 在开发 API 接口之前&#xff0c;首先需要明确接口的功能需求。这包括确定接口要提供哪些数据…

“智能科研写作:结合AI与ChatGPT提升SCI论文和基金申请质量“

基于AI辅助下的高效高质量SCI论文撰写及投稿实践 科学研究的核心在于将复杂的思想和实验成果通过严谨的写作有效地传递给学术界和工业界。对于研究生、青年学者及科研人员&#xff0c;如何高效撰写和发表SCI论文&#xff0c;成为提升学术水平和科研成果的重要环节。系统掌握从…

ProteinMPNN中DecLayer类介绍

PositionWiseFeedForward 类的代码 class PositionWiseFeedForward(nn.Module):def __init__(self, num_hidden, num_ff):super(PositionWiseFeedForward, self).__init__()self.W_in = nn.Linear(num_hidden, num_ff, bias=True)self.W_out = nn.Linear(num_ff, num_hidden, …

SAP_FICO模块-资产减值功能对折旧和残值的影响

一、业务背景 由于财务同事没注意&#xff0c;用总账给资产多做了一笔凭证&#xff0c;导致该资产金额虚增&#xff0c;每个月的折旧金额也虚增&#xff1b;现在财务的需求是怎么操作可以进行资产减值&#xff0c;并且减少每个月计提的折旧&#xff1b; 二、实现方式 通过事务码…

linux CentOs7 安装 FastDFS

CentOs7 安装 FastDFS 1. 安装依赖 yum install gcc libevent libevent-devel -y#进入src目录 cd /usr/local/src2. 安装 libfastcommon 库 libfastcommon 库是 FastDFS 文件系统运行需要的公共 C 语言函数库 # 下载 wget https://github.com/happyfish100/libfastcommon/a…

使用梧桐数据库进行销售趋势分析和预测

在当今竞争激烈的商业环境中&#xff0c;企业需要深入了解销售数据&#xff0c;以便做出明智的决策。销售趋势分析和预测是帮助企业把握市场动态、优化库存管理、制定营销策略的重要工具。本文将介绍如何使用SQL来创建销售数据库的表结构&#xff0c;插入示例数据&#xff0c;并…

6.2024.10.22

2024.10.22 2024.10.22 2024.10.22 今天没怎么学习嵌入式的&#xff0c;找时间补上今天学习的空缺。

qt EventFilter用途详解

一、概述 EventFilter是QObject类的一个事件过滤器&#xff0c;当使用installEventFilter方法为某个对象安装事件过滤器时&#xff0c;该对象的eventFilter函数就会被调用。通过重写eventFilter方法&#xff0c;开发者可以在事件处理过程中进行拦截和处理&#xff0c;实现对事…