DP?

QwQ这题似乎不能直接贪心2333——

阶段

很明显的阶段性,\(n\)关便为\(n\)个阶段,

状态

分好阶段后,容易构造出状态的表达:

\(f[i,j]\)表示Ma5termind在最开始要带\(f[i,j]\)个子弹,才能打到第\(i\)关,并打倒第\(i\)关第\(j\)个敌人。

状态转移

Ma5termind在第\(i\)关获得的敌人的子弹只能使用到第\(i+1\)关。

可见当前状态是由上一个阶段(即\(i-1\))推过来的

于是我们得到这么个状态转移方程:

\[\begin{cases}
f[i,j]=min(f[i-1,k]|1 \leq k \leq n)&\text{当}b[i-1,k]>p[i,j]\\
f[i,j]=min(f[i-1,k]+p[i,j]-b[i-1,k]|1 \leq k \leq n) &\text{当}b[i-1,k] \leq p[i,j]
\end{cases}
\]

假的End

70分愉快的炸啦2333

优化?贪心?

没错,就是贪心啦

官方题解中用mapvector实现了一个很玄学的贪心,让我们来分析一下把!

因为\(p[i,j]\)是一个常数,于是我们可以把dp方程变为:

\[\begin{cases}
f[i,j]=min(f[i-1,k]|1 \leq k \leq n)&\text{当}b[i-1,k]>p[i,j]\\
f[i,j]=min(f[i-1,k]-b[i-1,k]|1 \leq k \leq n)+p[i,j] &\text{当}b[i-1,k] \leq p[i,j]
\end{cases}
\]

所以每个状态更新时就变成了最值查找啦,强行qsort就发挥作用啦!

然后我们就可以用接近\(O(m)\)的时间复杂度寻找更新状态啦。

我们使用map1存上一阶段的状态map,map2为当前阶段的map,

先考虑第二种情况

\[f[i,j]=min(f[i-1,k]-b[i-1,k]|1 \leq k \leq n)+p[i,j] \text{当}b[i-1,k] \leq p[i,j]
\]

一言不合上代码:

  j:=1;  k:=1; tmp:=maxlongint;
while j<=m do
begin
while (k<=m) and (map1_b[k]<=map2_p[j]) do
begin
tmp:=min(tmp,map1_f[k]-map1_b[k]);
inc(k);
end;
f[i,map2_j_num[j]]:=min(f[i,map2_j_num[j]],tmp+map2_p[j]);//别忘记加上常数p
inc(j);
end;

这个操作的时间复杂度忽略常数接近\(O(m)\),为什么是对的?

班门弄斧地证明一下2333,我们用类似数学归纳法的方法证明——

对于j

我们先称满足\(map1_b[k] \leq map2_p[j]\)在map1的\([1,k]\)区间为对于当前状态\(f[i,j]\)的最小满足区间

在这个区间里,那么因为是按照\(map1_b\)为关键字升序排序的,所以后面的\(map1_b[k]\)都会大于\(map2_p[j]\)

所以显然,当前检查到\([1,k]\)是对于当前状态\(f[i,j]\)的最小满足区间,那么这区间中最小的\(f[i-1,k]-b[i-1,k]\)(即\(tmp\))对于\(j\)是最优的 (满足条件\(b[i-1,k]<=p[i,j]\)情况下)

对于j+1?

又因为这个map2_p是按照升序,所以\(j+1\)的\(p\)是大于当前\(j\)的,

那么如果\(j+1\)时不更新\(k\),也就是说\(tmp\)不会变,这意味着\([1,k]\)也是他的最小满足区间,所以这个区间中最小值\(tmp\)也是对于\(j+1\)最优的 (满足条件\(p[i,j]>b[i-1,k]\)情况下)

如果更新的话,那就和对于j的情况是类似的啦,我们会继续找到最小满足区间然后更新。

类似的,对于第一种情况,我们也能按照类似这样的方法证明和更新状态,时间复杂度约为\(O(n\times m\times log_2^m)\),空间复杂度约为\(O(n \times m)\)

A Super Hero的更多相关文章

  1. JAVA 泛型通配符 ? EXTENDS SUPER 的用法

    1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...

  2. News Master-DC and Marvel they are super heroes mother

    News Master Good evening everyone,I’m Jason,I’m glad to be news master to share something, Tonight I ...

  3. What's New in C# 6.0

    Static Types as using So, we are all quite familiar with this notion of accessing static class membe ...

  4. 10 Ways to Inspire Your Team

    Inspire. Just the word itself causes us to pause and think. We may remember our own personal heroes ...

  5. [Angular 2] Property Binding

    Property Binding is bind property NOT attribute! import {Component, Input, Output, EventEmitter} fro ...

  6. What's New in C# 6.0(转)

    原文地址:http://www.codeproject.com/Tips/1023426/Whats-New-in-Csharp 本来想翻译一下贴出来,但是好像很多语言组织起来比较困难,读书少不会表达 ...

  7. java基础(9) - 泛型解析

    泛型 定义简单的泛型类 泛型方法 /** * 1.定义一个泛型类 * 在类名后添加类的泛型参数 <T> * 泛型类里面的所有T会根据创建泛型类时传入的参数确定类型 * 2.定义泛型方法 * ...

  8. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  9. java泛型基础、子类泛型不能转换成父类泛型

    参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...

  10. Python基础7:字符串方法

    1 * 重复输出字符串 print('helo '*4) 2 [],[:] 通过索引获取字符串中的字符,这里和列表中的切片操作是相同的,具体内容见列表 print('hello word'[2:]) ...

随机推荐

  1. el-tree 点击父级或者父级的checkbox,展开所有子集

    <el-tree :data="authData" show-checkbox :check-strictly="true" :check-on-clic ...

  2. 【ubuntu20】解压文件

    第一类处理 *** .zip或 ***.rar 时,需要先下载相对应的unzip和unrar,可在终端,执行 sudo apt-get install unzipsudo apt-get instal ...

  3. Django操作redis

    一.环境安装 基本环境: Python环境:Python 3.8.16 Django环境:4.1 redis环境:参考搭建 https://www.cnblogs.com/yclh/p/1474233 ...

  4. [转载]OpenCV中的channel是什么意思?

    转载自https://answers.opencv.org/question/7585/meaning-of-channels/ 简单来说,就是描述一个pixel的颜色用多少个独立的参数描述,这个个数 ...

  5. vue2 element-ui组件二封-表单组件-按钮封装

    这里是一段我们公司过往项目的代码(增删改查项目中的查询/重置按钮) <el-button @click="query()" type="primary" ...

  6. leetcode-152乘积最大子数组(两个转移方程的正确性证明)

    1.dp数组的含义 maxDP[i]中存储 以nums[i]为结尾元素的子数组的最大乘积minDP[i]中存储 以nums[i]为结尾元素的子数组的最小乘积 注意到:maxDP[i] >= mi ...

  7. 防止react-re-render: Why Suspense and how ?

    近期内部项目基础项目依赖升级,之前使用的路由缓存不再适用,需要一个适配方案.而在此过程中react re-render算是困扰了笔者很久.后来通过多方资料查找使用了freeze解决了此问题.本文主要论 ...

  8. django项目中使用swagger来实现接口文档自动生成

    一.Swagger 一般我们在对接前后端的时候,都需要提供相应的接口文档.对于后端来说,编写接口文档即费时费力,还会经常因为没有及时更新,导致前端对接时出现实际接口与文档不一致.而且手写接口文档还容易 ...

  9. HTML弹窗设计二

    <!DOCTYPE html><html> <head> <title>模态框弹出层.html</title> <meta http- ...

  10. Day 11 11.1 Xpath解析

    xpath解析 xpath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但xpath明显比re具有优势,在网页分析上使re退居二线. ...