首页 > 其他分享 >2024.9.13 总结(考 DP)

2024.9.13 总结(考 DP)

时间:2024-09-14 21:45:52浏览次数:11  
标签:map 13 14 2024.9 房间 unordered DP

(实际上是 2024.9.14 写的)

本来以为是考 DS 的。()

T1

题目里给的那个性质可能是来干扰的。

异或上右移一位的数,其实就是除了第一位(最左边的),算贡献的时候都要看这一位异或前一位是不是 1。于是随便线性 DP,状态里记一下当前位填 0 还是 1 就行了。

DP 数组 状态的第一维 可以不要,省空间。

T2

板子。

ST 表、线段树、猫树等应该都可。我写的线段树。

当然如果用 ST 表的话应该也能算是 DP。

(其实用线段树或者猫树似乎也都算 DP 吧?)

T3

神秘。但是看题面又感觉有点点经典。

要求最后每个房间有 0 或 4 或 7 个人。

先想了下有没有什么贪心的结论,发现自己不会贪心,但是人的移动要“就近”。

发现一个显然的结论——可以把人的移动看成 人一个房间一个房间地移动。于是考虑 DP,从前往后看每个房间,只把前面房间里的人往后移,后面房间里的人往前移就相当于前面向后面移负数个人。直觉感觉这样直接用负数是对的,想了一下好像确实是对的。

于是设 \(f _ { i , j }\) 表示处理了前 \(i\) 个房间,前面的房间(\(1\) 到 \((i - 1)\))都满足了要求,\(i\) 房间有 \(j\)(可以为负数)人,此时的最小代价之和(最小移动步数之和)。枚举房间 \((i - 1)\) 最终要剩几个人来转移。

发现 \(j\) 的范围好像很大,而且有些 \(f _ {i, j}\) 用不到(无法被走到)。于是用 unordered_map 来记 \(f\)。滚动数组滚掉第一维。

现在还是过不了。考虑剪枝。

这些内容可能不对:如果一个位置有 \(\geq 14\) 个人,那么就一定可以把其中 \(7\) 个放在之前的房间里,让这 \(7\) 个人继续往后走一定是不优的。如果一个位置有 \(\leq - 14\) 个人,那么也是这样的,因为这相当于 从右往左走,和 从左往右走 在这一点上是一样的。

于是就考虑如果 \(- 14 \leq j \leq 14\) 才要 \(f _ {i, j}\) 这个状态。这样就能过了。

实际上都这样了可能就不用 unordered_map 了。但是我是直接在 unordered_map 版本上改的(现在 AC 了),没试过不用 unordered_map。

这个做法(用负数)我大概是从高精度减法里悟到的。

[题解做法类似。但是它记的是从上一个房间到这个房间的人数(也可以为负),更为优秀。(\(j\) 似乎是 \(- 7\)(包含)到 \(7\)(包含)的)。](??)

T4

注意仔细审题:一个人如果装饰,装饰的是一个长度不超过 \(x\) 的区间,且 \(p\) 在这个区间中。

数据范围比较奇怪,发现可以 \(O(nm)\)。

那么对于每个人,对于所有他能装饰的区间,在右端点上考虑左端点的范围。

题目是显然的区间分割类 DP。设 \(f _ i\) 表示处理了 \(1\) ~ \(i\) 位置的最大价值和。

对每个点,枚举每个人的每个可装饰区间,记当前的可装饰区间为 \([j + 1, i]\),转移方程为:

\(f _ i = \max ( f _ j + (i - j) * y )\)

考虑优化。把 \((i - j) * y\) 拆成 \(i * y - j * y\)。求 \(f _ j - j * y\) 的最大值即可。用 \(m\) 棵线段树来优化(因为有 \(m\) 个 \(y\))。

时间好像是 \(O(nm\log n)\)。

但是这个做法还没过,不知道为什么。

题解的[单调队列](?)做法时间复杂度好像更优。还没学。

总结(经验教训)

  1. 如果不会优化某个 DP 就拆 DP 式子,把与 \(i\)(当前点)相关的和与 \(j\)(从 \(j\) 转移来)相关的分开,可能就能优化了。(T4)
  2. 要学会从学过的东西里来迁移。(T3)
  3. DP 也可以剪枝(不要一定不优的状态)。(T3)

2024.9.14

标签:map,13,14,2024.9,房间,unordered,DP
From: https://www.cnblogs.com/huangkxQwQ/p/18414738

相关文章

  • FIT5137 M-Stay Residential service
    FIT5137Assignment2-S22024 (Weight=40%)Due-Friday,20September2024,4:30PMGeneralInformationandSubmissiono Thisisanindividualassignment.o Submissionmethod:SubmissionisonlinethroughMoodle.o Penaltyforlatesubmission:5%deduc......
  • WordPress加载流程的解读分析
    index.php```php<?php/**这个文件只用来加载'/wp-blog-header.php'**@packageWordPress//**声明一个全局变量,用来判断是否加载主题**@varbool/define('WP_USE_THEMES',true);/*加载WordPress环境和模板/requireDIR.'/wp-blog-header.php';```wp......
  • 南沙C++noip老师解一本通题: 1360:奇怪的电梯(lift)
    ​【题目描述】大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:33125代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4......
  • 章13——常用类——包装类,Integer类
    包装类ctrl+b可以跳转源代码。char和boolean的继承体系:包装类和基本数据的转换//装箱intn=200;Integerinteger=n;//拆箱intn1=integer;包装类练习题三元运算符中是一个整体,其中精度最高的是double,所以无......
  • 滴滴9.13笔试
    难度不大,第二题的\(O(n)\)带有一点思维第一题滑动窗口板子题:求和不超过m的最大区间长度#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;longlongm;cin>>n>>m;vector<int>nums;for(inti=0;i<n;i++)......
  • C语言 13 指针
    指针可以说是整个C语言中最难以理解的部分了。什么是指针还记得在前面谈到的通过函数交换两个变量的值吗?#include<stdio.h>voidswap(int,int);intmain(){inta=10,b=20;swap(a,b);printf("a=%d,b=%d",a,b);}voidswap(inta,intb)......
  • 2024.9.13(周五)
    完成机器学习查询数据集的作业数据集名称样本数属性属性个数标签任务Iris数据集150花萼长度,花萼宽度,花瓣长度,花瓣宽度4鸟类(Setosa,Versicolor,Virginica)分类MNIST数据集70,000像素值(28x28像素)784手写数字(0-9)分类Titanic数据集891乘客ID,船舱......
  • WordPress加载流程的解读分析
    index.php```php<?php/**这个文件只用来加载'/wp-blog-header.php'**@packageWordPress//**声明一个全局变量,用来判断是否加载主题**@varbool/define('WP_USE_THEMES',true);/*加载WordPress环境和模板/requireDIR.'/wp-blog-header.php';```wp......
  • LeetCode239. 滑动窗口最大值(2024秋季每日一题 13)
    给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例1:输入:nums=[1,3,-1,-3,5,3,6,7],k=3输出:[3,3,5,5,6,7]解释:示例2:输入:nums=[1],k......
  • RM1135、RM1135T量产修复成功,RTS5735DL量产工具操作教程,RTS5765DL、RTS5772DL开卡大致
    自己的固态坏了,本来打算找数据恢复公司恢复数据的,问了一下,大约需要上千块钱,算了,自己的数据还没这么值钱,于是就直接开卡了。这里把我自己研究的开卡方法分享给大家,注意开卡后硬盘数据会完全被擦除,不能恢复,所以有重要数据的话要提前备份!不好好看提示出了问题不要找我。开卡前必须准备......