力扣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能力简介二维码生成根据开…

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

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

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

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

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

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

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

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

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

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

qt EventFilter用途详解

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

go 语言 Gin Web 框架的实现原理探究

Gin 是一个用 Go (Golang) 编写的 Web 框架&#xff0c;性能极优&#xff0c;具有快速、支持中间件、crash处理、json验证、路由组、错误管理、内存渲染、可扩展性等特点。 官网地址&#xff1a;https://gin-gonic.com/ 源码地址&#xff1a;https://github.com/gin-gonic/gi…

Shell重定向输入输出

我的后端学习大纲 我的Linux学习大纲 重定向介绍 标准输入介绍 从键盘读取用户输入的数据&#xff0c;然后再把数据拿到Shell程序中使用&#xff1b; 标准输出介绍 Shell程序产生的数据&#xff0c;这些数据一般都是呈现到显示器上供用户浏览查看; 默认输入输出文件 每个…

前OpenAI首席技术官为新AI初创公司筹资;我国发布首个应用临床眼科大模型 “伏羲慧眼”|AI日报

文章推荐 2024人工智能报告.zip &#xff5c;一文迅速了解今年的AI界都发生了什么&#xff1f; 今日热点 据报道&#xff0c;前OpenAI首席技术官Mira Murati正在为一家新的AI初创公司筹集资金 据路透社报道&#xff0c;上个月宣布离职的OpenAI首席技术官Mira Murati正在为一…

栈和队列(一)

栈和队列的定义和特点 栈和队列是一种特殊的线性表&#xff0c;只能在表的端点进行操作 栈的定义和特点 这就是栈的结构&#xff0c;是一个特殊的线性表&#xff0c;只能在栈顶&#xff08;或者说是表尾&#xff09;进行操作。其中top为栈顶&#xff0c;base为栈底 栈s的存储…

华为:高级ACL 特定ip访问特定ip命令

网络拓扑图&#xff1a; 网络环境&#xff1a; 全网互通即可 1.创建一个名为test的高级ACL acl name test advance 2.添加规则 ##拒绝所有ip访问 rule 10 deny ip source any destination 192.168.1.10 0.0.0.0 只允许特定ip访问特定ip rule 5 permit ip source 192.168.2.10…

【Vulnhub靶场】Kioptrix Level 5

目标 本地IP&#xff1a;192.168.118.128 目标IP&#xff1a;192.168.118.0/24 信息收集 nmap探测存活主机&#xff0c;扫全端口&#xff0c;扫服务 首先探测到目标ip为&#xff1a;192.168.118.136 nmap -sP 192.168.118.0/24nmap -p- 192.168.118.136nmap -sV -A 192.168.…

BurpSuite渗透工具的简单使用

BurpSuite渗透工具 用Burp Suite修改请求 step1&#xff1a; 安装Burp Suite。官网链接&#xff1a;Burp Suite官网 step2&#xff1a; 设置代理 step3&#xff1a; 如果要拦截https请求&#xff0c;还需要在客户端安装证书 step4&#xff1a; 拦截到请求可以在Proxy ->…

【嵌入式实时操作系统开发】智能家居入门4(FreeRTOS、MQTT服务器、MQTT协议、STM32、微信小程序)

前面已经发了智能家居入门的1、2、3了&#xff0c;在实际开发中一般都会使用到实时操作系统&#xff0c;这里就以FreeRTOS为例子&#xff0c;使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机&#xff0c;系统实时性强了很多&#xff0c;小程序下发…

opencv环境配置-适配b站阿童木的opencv教程

首先&#xff0c;opencv作为一个库文件&#xff0c;目的是为了让更多人不需要学习底层像素操作就能上手视觉技术&#xff0c;所以他适配很多环境&#xff0c;目前电脑端我知道的就可以适配C语言 C Python MCU端就是openmv跟他最类似&#xff0c;还有个k210 canmv 阿童木教的…

Unity 山水树木

本章节内容 1. Unity对3D游戏物体的简单操作&#xff1b; 2. 构建山水树木的场景 1. Unity 简易操作 1.1 新建3D游戏场景 1. 打开Unity Hub&#xff0c;点击 New Project &#xff08;新建项目&#xff09;按键&#xff0c;选择第二项 3D(Built-In Render Pipeline)&#xf…

Linux之实战命令41:lshw应用实例(七十五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

虚拟滚动是怎么做性能优化的?

前言 一个简单的情景模拟&#xff08;千万别被带入&#xff09;&#xff1a; A&#xff1a; 假设现在有 10 万条数据&#xff0c;你作为前端该怎么优化这种大数据的列表&#xff1f; B&#xff1a; 针对大数据列表一般不会依次性加载&#xff0c;会采用上拉加载、分页加载等…

如何用数据字典提升数据质量和决策效率?

在前面的文章中我们谈到过数据字典的概念&#xff0c;本文将继续探讨如何用数据字典提升数据质量和决策效率。 一、数据字典 数据字典&#xff1a;一种对数据的定义和描述的集合&#xff0c;它包含了数据的名称、类型、长度、取值范围、业务含义、数据来源等详细信息。 数据字…