DAY19

题目一

 空间尝试模型 一个样本做行一个样本做列

范围尝试模型 以....做分隔

dp[i][j] 为以i为左界限 以j为右界限 求这个范围内的计算值(不对 是方法数)

这& | ^ 都是双目运算符 观察一下规律 整体字符数量一定为奇数(包括运算符和数字) 对应到数组中 数组的位一定是偶数 所以每个奇数行奇数列都不要 L不能超过R 下半区也不要(经典空间尝试模型)

那条件转移是什么呢 假设左界限 有界限 中间值为 x  那么i....x-1  x+1.....j  注意审题 是可以加括号也就是说可以决定运算顺序 也就是说 一个字符串的结果 不是固定的

条件转移是什么呢 假设左界限 有界限 中间有个位置为 x  那么i....x-1  x+1.....j 

这个x位置肯定是个符号 自己举个例子就知道喵

当这个符号为&的时候 那简单  左边和右边都为1 结果才为1 左边右边有一个是0 都是0 总之就是左右相乘

但是|就比较麻烦 左1右0 为1 左0右1 为1   左1右1 为1 左0右0 为0

^呢 异或是 左1右1 为0 左0右1 左1右0 为1   左0右0 为0.

然后在这个基础呢 假如说 拿& 我左侧有3种方法为1 右侧有三种方法为1 那么我总的true的方法为 3*3对吧 记住这个dp[i][j]是方法数

所以要有两个dp数组 tdp 和 fdp 分别表示L到R范围内的(true/false)的方法数

basecase 是L==R的时候 如果是1 的话 那就是 tdp 当前位置有一种方法 0就是fdp位置有一种方法

否则为0

public static int ExpressionNumber0(String express, boolean desired){
		char [] chars = express.toCharArray();
		int N = chars.length;
		int [][] tdp = new int [N][N];
		int [][] fdp = new int [N][N];
		for(int i = 0;i<N;i+=2) {
			tdp[i][i] = chars[i] == '1'?1:0;//不用单引号就是ASCII码了
			fdp[i][i] = chars[i] == '0'?1:0;
		}
		for (int row = N - 3; row >= 0; row -= 2) {
			for (int col = row + 2; col < N; col += 2) {//行等于列的已经填完了 这次往上移动一下 就是两个格子 //col<的是N哦 所以是一行之内 先填前面 再填后面 所以可以依赖左方和下方
				for (int i = row + 1; i < col; i += 2) {//用这个i枚举每一个分界点  顺便说下既然依赖于左下的格子
				    switch (chars[i]) {//注意这里行+1 是符号的位置 我得用它来确定转移方程 +1-1是格子的位置 格子的位置不能是符号位
					case ('&')://记住是+= 这是累加的
						tdp[row][col] += tdp[row][i-1]*tdp[i+1][col];
					    fdp[row][col] += fdp[row][i-1]*fdp[i+1][col]+fdp[row][i-1]*tdp[i+1][col]+tdp[row][i-1]*fdp[i+1][col];
						break;
					case('|'):
						tdp[row][col] += tdp[row][i-1]*fdp[i+1][col] + fdp[row][i-1]*tdp[i+1][col]+tdp[row][i-1]*tdp[i+1][col];
						fdp[row][col] += fdp[row][i-1]*fdp[i+1][col];
						break;
					case('^'):
						tdp[row][col] += tdp[row][i - 1] * fdp[i + 1][col]+fdp[row][i - 1] * tdp[i + 1][col];
				    	fdp[row][col] += tdp[row][i - 1] * tdp[i + 1][col]+fdp[row][i - 1] * fdp[i + 1][col];
						break;
					}			
				}
			}
		}
		return desired?tdp[0][N-1]:fdp[0][N-1];
	}

题目二

给一个数组 划分多个数组 在哪一种划分下 能让异或和为0的更多

经典的从左往右尝试模型+范围尝试模型

dp[i] 表示从0...i最多有多少0

我们假设这种分法是 最多0的

(1) 当i位置(所属的块)异或和不为0的时候 dp[i] = dp[i-1]   

(2) 当i位置(所属的块)异或和为0  

假设答案法 假如说当前分法是最佳答案

假如其中有任意一块区域j...i那这之间肯定不存在一个k 让k...i异或和为0 因为你这相当于又切了 一块 我们开始已经假定这个是最优答案了 这就冲突了 

那假设我们的最后一块区域为j....i 这个j 一定是 离i最近的 能让这块区域异或和为0的  0^0==0 所以

0....j  j+1....i异或和都为0  我们找到j位置的答案 它再+1(我们现在说的这一块) 结果就是i位置的答案

public static int MostEOR(int [] arr) {
		if (arr == null || arr.length == 0) {
			return 0;
		}
		int [] dp = new int [arr.length];
		dp[0] = arr[0]==0?1:0;		
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		int eor = 0;
		map.put(0, -1);
		map.put(arr[0],0);
		for(int i = 1;i<arr.length;i++) {
			eor^=arr[i];
		   if(map.containsKey(eor)) {
			   int pre = map.get(eor);
			   dp[i] = pre == -1 ? 1 : (dp[pre] + 1);//如果等于-1 就是异或和为0 直接算一种 当然如果后面又有0出现 那就回替换掉最开始的
			   //它只对应一种情况 从0...i累加和就是 0 且中间还没出现过其他的0  所以它只有一个0
		   }
		   dp[i] = Math.max(dp[i - 1], dp[i]);
		   map.put(eor, i);
		}
		return dp[dp.length - 1];
	}

和子序列一样 都是可能性的组织 几个可能性里面取一个most 既然要求最长/多 那就用most 是不是有点牵强了

我老觉得是 既然最后只有一种情况作为答案了 那为什么还要多个比较

答:有多种if 每种情况都可以选择 他们都是存在的 只是看我们的选择哪个作为这个位置的答案而已 所以选择多的那个

题目三

给出一组正整数arr,你从第0个数向最后一个数,
每个数的值表示你从这个位置可以向右跳跃的最大长度
计算如何以最少的跳跃次数跳到最后一个数。
 

首先我们要理解 不是每个点都跳到最远好 因为你可能会错过一个大长度

而且这个模型不用考虑往回跳 因为你完全可以中间停下来 为啥要往回跳 

五步最远能跳多远

四步最远的地方 一定比五步最远跳的近(废话)

四步每个能到的位置 加上自身的值 其中一定有一个是五步的右边界(走到最远的地方)

第一步我可以走到 i的位置 也就是说第一步的区间是0...i 这个区间里我可以选择任何一个地方作为落脚点 走第二步 但是目前我们看不出 我们可以选择在哪落脚是迈出第二步是最优解 不过没关系 我们直接枚举每一个落脚点 看看最远能走到哪 也就是找出第三步的区间...以此类推 看看最先什么时候扩到对应区间

感觉有哪不通?我也是

对于第四步来说 假如我选了其中一个落脚点 那么我这个落脚点走不到5步的区间的最右怎么办?那就不要选啊 就选能到达最边界的步 那我到达了最边界 最边界上面的步数 是一个很小的点那下一步怎么扩充 无所谓啊 我们会枚举每一个落脚点 来扩充下一步 对于每一个区间 它的每一点都是可达的 然后用它扩充出来的区间 也一样是可达的 所以不同区间所有点都是可达的 如果这个点肯定是上一个区间的某个点跳过来的 那这个调过来的点 也是上上个区间调过来的

public static int jump(int[] arr) {
		if (arr == null || arr.length == 0) {
			return 0;
		}
		int step = 0; // 跳了多少步
		int cur = 0; // step步内,右边界
		int next = 0;// step+1步内,右边界
		for (int i = 0; i < arr.length; i++) {
			if (cur < i) {
				step++;
				cur = next;
			}
			next = Math.max(next, i + arr[i]);
		}
		return step;
	}

被笔记骗了 压根没有什么flag -1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-39 openGauss 高级数据管理-分区表

文章目录 openGauss学习笔记-39 openGauss 高级数据管理-分区表39.1 范围分区表的分类39.2 创建范围分区39.2.1 创建VALUES LESS THAN范围分区表语法格式39.2.2 创建VALUES LESS THAN范围分区表参数说明39.2.3 创建VALUES LESS THAN范围分区表示例 39.3 询分区表39.3.1 查询分区…

​​C++多态​​

目录 1. 多态的概念 2. 多态的定义及实现 多态的构成条件 虚函数 虚函数的重写 特例 override 和 final 1. final&#xff1a;修饰虚函数&#xff0c;表示该虚函数不能再被重写 2.override: 检查派生类虚函数是否重写了基类某个虚函数&#xff0c;如果没有重写编译报错…

档案库房智能管理系统的功能有哪些呢?

档案库房智能管理系统是一个基于人工智能技术的综合性档案管理解决方案&#xff0c;通过自动化、智能化的方式&#xff0c;优化了档案管理流程&#xff0c;提高了工作效率和信息安全性。 1.档案入库管理&#xff1a; 档案信息录入&#xff1a;系统可以通过扫描、识别和自动填写…

Qt应用开发(基础篇)——框架类 QFrame

一、前言 QFrame继承于QWidget&#xff0c;被QLCDNumber、QToolBox、QLabel、QListView等部件继承&#xff0c;是一个拥有矩形框架的基类。 QFrame可以直接创建成一个没有内容的的矩形框架&#xff0c;框架的样式由边框厚度(lineWidth)、框架形状(QFrame::Shape)和阴影样式(QFr…

在vue中使用swiper轮播图(搭配watch和$nextTick())

在组件中使用轮播图展示图片信息&#xff1a; 1.下载swiper,5版本为稳定版本 cnpm install swiper5 2.在组件中引入swiper包和对应样式&#xff0c;若多组件使用swiper&#xff0c;可以把swiper引入到main.js入口文件中&#xff1a; import swiper/css/swiper.css //引入swipe…

玩转IndexedDB,比localStorage、cookie还要强大的网页端本地缓存

随着浏览器的功能不断增强&#xff0c;越来越多的网站开始考虑&#xff0c;将大量数据储存在客户端&#xff0c;这样可以减少从服务器获取数据&#xff0c;直接从本地获取数据。 现有的浏览器数据储存方案&#xff0c;都不适合储存大量数据&#xff1a;Cookie 的大小不超过 4K…

安科瑞电力监控系统在某区块页岩气地面集输工程中的应用

摘要&#xff1a;Acrel-2000Z电力监控系统适用于35kV及以下电压等级的各类变电站&#xff0c;可以帮助用户掌握配电系统实时运行状态&#xff0c; 获取预警、告警等各类事件&#xff0c;实现区域的无人值守&#xff0c;提高监管水平。本文介绍了安科瑞电力监控系统Acrel-2000在…

QEMU源码全解析37 —— Machine(7)

接前一篇文章&#xff1a;QEMU源码全解析36 —— Machine&#xff08;6&#xff09; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 上回书讲完了q…

java 加载商户API私钥 (pem证书私钥)

1. pem证书放在resources目录下 2. 加载证书的工具类 import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; // 商户API私钥 (把证书放在项目路径下, 然后加载出来), 加载证书的工具类PrivateKey merchantPrivateKey PemUtil.loadPrivateKey(new FileInp…

使用FTP文件传输协议的潜在风险

数据&#xff08;事实&#xff0c;数字&#xff0c;价值&#xff09;是当今业务运行的核心要素。但是&#xff0c;如果数据没有得到有效的存储和传输&#xff0c;它们就会成为阻碍业务发展的障碍。如果企业不能及时地把数据送到合适的地方&#xff0c;就会造成严重的经济损失。…

8.10 用redis实现缓存功能和Spring Cache

什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 通过Redis来缓存数据&#xff0c;减少数据库查询操作; 逻辑 每个分类的菜品保存一份缓存数据 数据库菜品数据有变更时清理缓存数据 如何将商品数据缓存起…

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法

Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法 目录 Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法一、问题描述二、解决方法1.打开 WORD 2019&#xff0c;点击菜单中的“文件”&#xff1b;…

买前必看!蓝牙耳机哪些牌子值得买?蓝牙耳机热销排行榜

蓝牙耳机作为现代生活必备的电子产品之一&#xff0c;我们在选购时的选择就显得尤为重要。随着各大科技公司对蓝牙耳机功能的不断完善&#xff0c;用户对于耳机的期望也越来越高&#xff0c;音质、性能、降噪、舒适度等方面都成为了用户选择蓝牙耳机时考虑的因素。接下来我们一…

Redis复制

在Redis中&#xff0c;用户可以通过执行SLAVEOF命令或者设置slaveof选项&#xff0c;让一个服务器去复制(replicate) 另一个服务器&#xff0c;我们称呼被复制的服务器为主服务器(master)&#xff0c;而对主服务器进行复制的服务器则被称为从服务器(slave)&#xff0c;如下图所…

网络协议栈-基础知识

1、分层模型 1.1、OSI七层模型 1、OSI&#xff08;Open System Interconnection&#xff0c;开放系统互连&#xff09;七层网络模型称为开放式系统互联参考模型 &#xff0c;是一个逻辑上的定义&#xff0c;一个规范&#xff0c;它把网络从逻辑上分为了7层。 2、每一层都有相关…

工厂方法模式-java实现

介绍 工厂方法模式&#xff0c;通过把工厂抽象为一个接口&#xff0c;这样当我们新增具体产品的时候&#xff0c;就只需要实现一个新的具体工厂类即可。一个具体工厂类&#xff0c;对应着一个产品。 请注意&#xff1a;在工厂方法模式中&#xff0c;一个具体工厂类只对应生产…

FPGA + WS2812采灯控制

文章目录 一、WS2812C-2020-V11、产品概述2、引出端排列及功能3、数据传输时间4、数据传输方法 二、使用WS2812C显示图片1、静态显示2、动态显示 一、WS2812C-2020-V1 1、产品概述 WS2812C-2020-V1是一个集控制电路与发光电路于一体的智能外控LED光源&#xff1b;其外型采用最…

谷粒商城第十一天-完善商品分组(主要添上关联属性)

目录 一、总述 二、前端部分 2.1 改良前端获取分组列表接口及其调用 2.2 添加关联的一整套逻辑 三、后端部分 四、总结 一、总述 前端部分和之前的商品品牌添加分类差不多。 也是修改一下前端的分页获取列表的接口&#xff0c;还有就是加上关联的那一套逻辑&#xff0c;…

7.3 详解NiN模型--首次使用多层感知机(1x1卷积核)替换掉全连接层的模型

一.前提知识 多层感知机&#xff1a;由一个输入层&#xff0c;一个或多个隐藏层和一个输出层组成。&#xff08;至少有一个隐藏层&#xff0c;即至少3层&#xff09; 全连接层&#xff1a;是MLP的一种特殊情况&#xff0c;每个节点都与前一层的所有节点连接&#xff0c;全连接…

7.5.tensorRT高级(2)-RAII接口模式下的生产者消费者多batch实现

目录 前言1. RAII接口模式封装生产者消费者2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-RAI…
最新文章