首页 > 其他分享 >关于判定性问题和最优化问题的联系的一些思考

关于判定性问题和最优化问题的联系的一些思考

时间:2023-08-09 19:55:38浏览次数:35  
标签:转化 水球 问题 判定 答案 最优化

关于判定性问题和最优化问题的联系的一些思考

引入

判定性问题

判定性问题 是指在某些约束条件下,给定命题判断 是否成立 的一系列问题。

比如:给定一张无向图 \(G\),判断图是否连通

答案只可能是两种:连通不连通。这就是一个判定性问题。

最优化问题

最优化问题(optimization problem)的一般提法是要选择一组参数(变量),在满足一系列有关的限制条件(约束)下,使设计指标(目标)达到最优值。

通俗地讲,最优化问题 是指在某些约束条件下,设法找到一组构造方式(解),使得此方式在所有的构造方式中是最优的。

比如:给定一张无向图 \(G\),输出最少需要添加多少条边使得图 \(G\) 连通

可能的答案有很多种,每一个可能的答案都对应了一组解,即一组待添加的边,但是需要在所有可能的答案中找到一个答案添加的边最少,也就是在此问题下的最优解。这就是一个最优化问题。

联系

假设 \((c, x_0)\) 表示一个最优化问题:在约束条件 \(c\) 下的最优解为 \(x_0\),假设 \((c, x, t)\) 表示一个判定性问题:在约束条件 \(c\) 下的解 \(x\) 是否能够取到,如果可以则 \(t = 1\),否则 \(t = 0\)。

在某些时候,\((c, x_0)\) 与一系列的 \((c, x, t)\) 可以互相转化

举例

二分答案

最经典的一个例子就是 二分答案

例如以下问题:

给定一个元素互不相同序列 \(a\),请求出序列中最大的元素。

这是一个简单的 最优化问题,我们可以轻而易举的枚举序列 \(a\) 中的所有元素,互相比较来解决这个问题,这是一个线性的算法。

出人意料地,这个 最优化问题 可以转化为 判定性问题

给定一个元素互不相同序列 \(a\),请判断 \(x\) 是否是序列中最大的元素。

我们可以讲序列中所有 \(< x\) 的数都置为 \(0\),序列中所有 \(\ge x\) 的数都置为 \(1\),这样只需要判断序列中元素的和是否为 \(1\) 即可判断。

而沟通这个 最优化问题判定性问题 的桥梁就是 二分答案,如果枚举每一个 \(x\) 即可转化为上述 判定性问题,这个过程可以通过 二分答案 优化。

如果 \(n\) 是数组长度,时间复杂度是 \(O(n\log n)\) 的,这个二分答案的算法可以扩展到区间多次第 \(k\) 大数,也就是著名的 整体二分 算法。

在这个简单的例子中似乎体现不了 转化 的必要性,但在以下这道题目中这种转化是十分必要的。

  1. P1182 数列分段 Section II

给定的一个长度为 \(N\) 的正整数数列 \(A_{1\sim N}\),现要将其分成 \(M\)(\(M\leq N\))段,并要求每段连续,且每段和的最大值最小。

通过二分答案的 转化,将问题转化为如下判定性问题:

给定的一个长度为 \(N\) 的正整数数列 \(A_{1\sim N}\),每一段的最大值不得超过 \(x\),能否将序列分成不超过 \(M\) 段。

此判定性问题可以贪心求解。

  1. UVA10816 Travel in Desert

沙漠中有 \(n\) 个绿洲(编号为 \(1-n\) )和 \(e\) 条连接绿洲的双向道路。每条道路都有一个长度 \(d\) 和一个温度值 \(r\) 。给定起点绿洲编号 \(s\) 和终点绿洲编号 \(t\) ,求出一条 \(s\) 到 \(t\) 的路径,使得这条路径上经过的所有道路的最高温度尽量小,如果有多条路径,选择总长度最短的那一条。

通过二分答案的 转化,将问题转化为判定性问题,解法略。

动态规划

  1. UVA10934 Dropping water balloons

有一座高 \(n\) 层的楼,你拥有 \(m\) 个相同的水球,一个水球从承受程度以下的楼层丢下不会破裂,否则会破裂,一旦破裂你会失去这个水球。

请问最少多少丢多少次水球可以将水球的承受限度测出来,如果次数多于 \(63\) 次则输出 "More than 63 trials",\(n\le 2^{64} - 1, m \le 100\)。

这是一个经典的动态规划问题,其原本的状态表示为 \(dp[i][j]\) 表示 \(i\) 层楼,用 \(j\) 个水球,最少多少次测出水球承受程度。

但是在这道题中完全无法存储这么大的状态,所以考虑优化状态表示。

通过 转化,\(dp[i][j][k]\) 表示 \(i\) 层楼,用 \(j\) 个水球,能否在 \(k\) 步内测出。

通过 转化,\(dp[i][j]\) 表示 \(i\) 个水球,\(j\) 步内最多测到多少层楼水球的承受程度,此状态表示可以实现转移。

最后枚举步数,比较 \(n\) 与 \(dp[m][i]\),即可得出 \(j\) 步内是否能够测到 \(n\) 层楼的承受程度。

在这道题中通过将 最优化问题 转化为 判定性问题,又将 判定性问题 转化为另一个 最优化问题 之后使用动态规划算法求解。

其他

  1. ABC309F Box in Box

给定 \(N\) 个立方体箱子,其中第 \(i\) 个箱子的高为 \(h_i\),宽为 \(w_i\),深为 \(d_i\)。

箱子可以任意翻转、旋转。请判定是否存在一对箱子,使得一个箱子可以严格容纳下另一个箱子。也就是说,把箱子 \(j\) 装到箱子 \(i\) 里面之后,(翻转/旋转)后对应的高、宽、深满足 \(h_i\gt h_j\),\(w_i\gt w_j\),\(d_i\gt d_j\)(请注意是严格大于)。

若存在,输出 Yes;否则输出 No

由于可以旋转,所以首先对 \(h, w, d\) 排序,假设 \(h_i \le w_i\le d_i\),问题转化为是否存在一个三维偏序关系,对于偏序问题,可以套路地将箱子按 \(h\) 排序,转化为是否存在 \(i < j, w_i < w_j, d_i < d_j\),用数据结构维护 \(w\) 这一维,剩下可以使用 CDQ 分治做,不过有更好的解法。

由于这是一个 判定性问题,可以考虑转化为 最优化问题

则原问题等价于判断是否

\[\min_{i < j, w_i < w_j} d_i < d_j \]

只需要用一棵下标为 \(w_i\),元素为 \(d_i\) 的线段树即可解决这个单点修改,区间查询最小值问题。

结语

信息学中有很多类似的问题转化,如果在某些 判定性问题 或者 最优化问题 中思路陷入了僵局,不妨考虑 转化 为另一个容易解决的问题。

由于作者水平有限,文中的错误在所难免,希望读者批评指正。

标签:转化,水球,问题,判定,答案,最优化
From: https://www.cnblogs.com/MoyouSayuki/p/17617872.html

相关文章

  • 大连人工智能计算平台——华为昇腾AI平台——高性能计算HPC的pytorch源码编译报错——
     如题:pytorch源码编译报错——USE_CUDA=OFF  在编译pytorch源码的时候发现错误,虽然编译环境中已经安装好CUDA和cudnn,环境变量也都设置好,但是编译好的pytorch包wheel总是在运行torch.cuda.is_available()显示false,于是从编译源码的过程中进行重新检查,发现在编译的过程中提......
  • 波动方程-初值问题-达朗贝尔公式的推导
    1.波动方程-初值问题-达朗贝尔公式的推导1.1.问题\[\begin{cases}加速度:u_{tt}=a^{2}u_{xx},x\inR,t>0\\初位移:u|_{t=0}=\varphi(x)\\初速度:u_{t}|_{t=0}=\psi(x)\end{cases}\tag{1}\]1.2.结论\[u=\frac{1}{2}[\varphi(x-at)+\varphi(x+at)]+\frac{1}......
  • Qt多语言切换时,QComboBox引起的一些问题
    板子Qt版本为5.9.5PC开发环境Qt版本为5.12.2界面有2个QComboBox,其中一个是用于切换语言,最开始使用的是voidcurrentIndexChanged(intindex)信号,多语言切换代码大致如下://绑定切换信号connect(ui->cbox_lang,QOverload<int>::of(&QComboBox::currentIndexChanged),this,&Fo......
  • SSH连接问题“No supported authentication methods available”
    SSH连接问题1.问题描述:  接到同事上报,在使用Putty登录远程服务器时出现如下问题,“Nosupportedauthenticationmethodsavailable”详情如图。  通过沟通得知,服务器最初提供的认证方式为密钥登录,为了方便使用想改为密码登录,并且同事已经对/etc/ssh/sshd_config配置文件进......
  • 同时安装jdk1.8和jdk11,jdk11不生效问题
     电脑之前安装的是1.8,后来又安装了jdk11,各种环境都配置好后,java-version版本,一直显示1.8网上最后,查到一个解决方法:    只需要打开path环境,把JAVA_HOME%bin上移到最上面就行! 参考:https://blog.csdn.net/zx1234578/article/details/123377437 ......
  • 解决window移植到linux shell执行Python脚本提示找不到模块问题
    1、将工程目录添加到sys.path中(测试有效importsyscpath='project_path'#写成项目的地址最好是绝对地址因为有的地方确实会报错不清楚原因sys.path.append(cpath) eg:sys_path=os.path.abspath(os.curdir)sys.path.append(sys_path.split('test_case')[0])#为了......
  • RR有幻读问题吗?MVCC能否解决幻读?
    幻读是MySQL中一个非常普遍,且面试中经常被问到的问题,如果你还搞不懂什么是幻读?什么是MVCC?以及MySQL中的锁?那么请好好收藏和阅读本篇文章,因为它非常重要。RR隔离级别在MySQL中,RR代表RepeatableRead(可重复读),是数据库事务隔离级别中的一种,它的特性是保证同一个事务中,多......
  • 前端shp文件写到本地时,原生的shp-write存在的不能写入多条数据及中文乱码问题
    shp-write·Doraemon22333/前端-码云-开源中国(gitee.com)参考(1)https://github.com/hwbllmnn/shp-write/tree/maintenance(2)https://blog.csdn.net/qq_37748236/article/details/131804606......
  • 在使用时序数据库 TDengine 进行 SQL 查询时,这些问题需要注意
    小T导读:尽管时序数据处理的特点是以写操作为主,读操作为辅,但查询需求也不容忽视。为方便用户上手,时序数据库(TimeSeriesDatabase)TDengine 采用SQL作为查询语言,主要查询功能包括单列及多列数据查询、数值列及聚合结果的四则运算、时间戳对齐的连接查询操作等,本文将就部分查询......
  • SpringBoot源码实用场景:SpringBoot 3.1.0 环境下 PageHelper 1.4.0不生效问题排查
    1、技术栈:JDK17+SpringBoot3.1.0+PageHelper1.4.01<?xmlversion="1.0"encoding="UTF-8"?>2<project...>3<parent>4<groupId>org.springframework.boot</groupId>5<arti......