国庆七天乐——第三天
2017102
【【动态规划】】
【基础内容】
状态设计:往往是观察在搜索过程中需要用到的参数,所表
示的含义往往是“最大”、“最小”、“方案总数”、“0/1”。
状态转移方程一般以数列递推的形式给出,在研究如何代码实现
转移设计:状态都有什么,应该如何转移,
注意无后效性
【线性动态规划】(所有你不能分到其它类里的dp就叫线性动态规划)
1拦截导弹
f[i]表示到第i个数的最长上升子序列的长度
f[i]=1
f[j]+1 j<I,a[j]<a[i]
滚动数组优化:当前状态只与上一层(或几层)有关,就新开一个数组g[n],表示上一层的状态
g[x]表示以不大于x结尾的最长上升子序列,单调不减
f[i]=1
g[a[i]-1]+1 j<I,a[j]<a[i]
#n^2#
优化:用树状数组来优化ànlogn
2拦截导弹+
求方案数。
开一个g[i]数组来表示当前这个数是由之前的几个数转过来的
g[i]=sigma(g[j]) , j<I, f[j]=f[i]-1
a[j]>a[i]
去重1:g只加最近的满足条件的g[j]
去重2:在整个数列的末尾(++n)加一个INF/max
这样在找最长上升子序列时,长度就直接是f[n],最后的答案就是g[n].(更加优美)
3数字三角形
f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j]
a是前缀和
4.数字三角形+(所得和数对233取模)
f[i][j][k]=f[i-1][j][(k-a[i][j]+233)%233]
| f[i-1][j-1][(k-a[i][j]+233)%233]
因为模数很小,所以可以用同余类来优化,
把余数相同的数分为一类,再加一维
因为c++负数取模还是负数,所以要再加233来防止出现素数
5.数字三角形++(有必须经过的点)
红点为必须经过的点
蓝色方框为可能经过路线的范围
这样我们dp的范围就限制在了每个方块内了,减少了计算量
【区间动态规划】
- 多边形表达式(环)
先化简:已知表达式,求加括号后的最大值
f[i][j]表示从i到j的表达式加括号后可达到的最大值
g[i][j]表示从i到j的表达式加括号后可达到的最小值
f[i][j]= 枚举k f[i][k-1] opk f[k+1][j] + *
f[i][k-1] opk g[k+1][j] -
g[i][k-1] opk k[k+1][j] *
g[i][k-1] opk g[k+1][j] *
分别来表示每种运算的最优结果
回归原题,多边形表达式,就是把一个环删掉一条边,变成一条链,然后依次枚举断开的边,但显然这样做是超时的,所以我们把这个链乘2,在去枚举每一个起点(长度为n),这样就可以依次遍历了(破环成链经典做法)
- 取数问题
F[i][j][k]表示时刻i,队列变为j-k的最大值
Ans=f[n][j][j-1];
f[i][j][k] max =f[i-1][j][k-1]+a[k]*t[i]
f[i-1][j+1][k]+a[j]*t[i]
当前这个时刻,取左右端点的最大值,当前这个时刻,由上一个时刻推来。如果是优化的话,可以把i这一维删掉。因为i=n-(k-j+1),所以用i的地方都可以用n-(k-j+1)代替(ti=总长-当前长)
f[i][j][k] max =f [j][k-1]+a[k]*t[n-(k-j+1)]
f[j+1][k]+a[j]*t[n-(k-j+1)]
- 合并果子 (堆)à哈夫曼编码
找到一个编码(无歧义)方式,试每个字符串的长度*出现次数的和最小。
实现方法就是维护一个每次合并前k小的优先队列
- 合并石子(相邻)
f[i][j]=f[i][k]+f[k+1][j]+s[i]+s[j];
- 合并石子+ 任意合并相邻2到n堆,求最少能量的消耗
脑筋急转弯解法:直接全部合并就好了。
- 合并石子++ 每次任意合并至少k堆,求最少能量的消耗
依旧是维护一个优先队列,但是要在队列末尾补0,来保证一定能实现k堆的合并且不影响答案。(小技巧)
- 删数游戏
f[i][j]表示i-j能否被删完(bool)
f[i][i]=0,f[i][i-1]=1
表示一个空区间,空区间是删除成功的,所以为1,同时也是为了下面打码方便。
f[i][j] |=(f[i][k-1]&f[k+1][l-1]&f[l+1][j])&a[l]-a[k]∈A)
左边被删完了,中间被删完了,右边被删完了,而且它们的等差在A里面。
优化:因为一个ak不可能出现在两个x中间这种情况(这两个x满足被删掉的理由),因为一旦出现了,那就说明ak应该早就被删掉了,所以只有可能是左边删完,右边删完。
f[i][j] |=f[i-1][k-1]&f[k+1][j] &a[l]-a[k]∈A) i<k<j
f[i+1][j-1]&(a[j]-a[i] ∈A) k==j
/************** |= 或等于 ****************************/
在所有的情况中,只要有一种是满足的就是1,否则为0
/*****************************************************/
8.删数游戏+ 删去2到3个长度的连续等差数列
分类讨论
两个长度的同上,三个长度的如下
f[i][j]|=f[i][l]&f[l+1][j]&a[l]+a[i]=2*a[k]&a[k]-a[i]in A
之前是枚举它的k的位置,怎么删,然而我们并不关心这个,我们只需要知道它能不能删就好了,所以依然是左右两段。
【记忆化搜索】
记忆化搜索其实是一种DP 求解的方法,而非特定的问题。
该方法一般用于较难确定更新顺序的DP 问题。
1. 滑雪
f[i][j] 表示到(i,j)的单调递减序列长度
f[i][j] max = f[i][j+1]+1, a[i][j+1]>a[i][j]
f[i+1][j]+1, a[i+1][j]>a[i][j]
f[i][j-1]+1, a[i][j-1]>a[i][j]
f[i-1][j]+1, a[i-1][j]>a[i][j]
滑雪的从上到下且不会回去的性质确定了这个题的无后效性,所以这个题可以用dp做。
枚举四个方向取一个max,同时不要忘了确定边界。
/********记忆化的精髓**************************/
if(vis[i][j]) return vis[i][j]
2. 数字三角形++
If(x1==x2&&y2!=y1) return –inf;
本来在起点的两个坐标的y值不相等
If(vis[x2][y2]) return vis[x2][y2];
If(y2<y1) return –inf;
往左下走,不可能
If(x2<=x1) return –inf;
向上走,不可能
【背包问题】
背包动规是一类经典的装箱问题的解决方案,也是将数值放
入DP 方程的典型代表。
1.0/1背包
For(i:1-n)
For(j:m-1)
f[j]=max(f[j],f[j-w[i]]+c[i];
2.完全背包
For(i:1-n)
For(j:1-m)
f[j]=max(f[j],f[j-w[i]]+c[i];
3. 多重背包
二进制优化,
单调队列优化,剩余类分类à滑动窗口à单调队列。
f[i][t] max =f[i-1][++j*w[i]]+j*c[i]
0<=j<=k[i],j*w[i]+t<=m
Step1:
f[i][r+p*w[i]]*w[i]] max=g[i-1][r+(i+p)*w[i]]
0<=j<=k[i], (j+k)*w[i]+r<=m
Step2:
f[i][r+p*w[i]]-=p*c[i];
#m*sigma(ki)#
4. 厉害一点的暴力背包
题面:一个容量为m 的背包,有n 个物品,第i 个物品的体积为wi,价值为ci。选择若干物品,使得体积总和不超过m 的情况下价值总和最大。
n<40,m 可能很大Meet in the middle!
解法,讲n分成两部分,
A 表示在前半部分中数据从小到大
B 前半部分的价值
C 表示在后半部分中数据从大到小
D 后半部分的价值
在A中枚举断点,因为An+Cn<=M,所以可以确定Cn,(都是一个范围)然后分别在其中找到所有里的最大的价值相加,就是当前这个断点的最优值,然后在所有最优值中找出最值,就是结果
5. 圆滑数
乘积末尾为0的数只有两种,
有一个(或多个)数本身为0
2*5;
所以我们就先求出2,和5在每个数里(乘积)出现的次数,(n2,n5)然后就是一个背包问题来计算所有数中2和5的数(试从中选k个)
f[i][k][j]=max(f[i-1][k][j],f[i-1][k-1][j-n5[i]]+n2[i])
ans=max(ans,min(j,f[n][k][j])
如果数据中有0的话,要加特判,保证不能为0
If(a[i]==0)
{
ans=1,vis[i]=1;continue;
//用vis来做标记}
背包的判断也要改成
If(j>=n5[i]&&!vis[i])
转载于:https://www.cnblogs.com/ZDHYXZ/p/7628706.html
国庆七天乐——第三天相关推荐
- 国庆七天乐,要猛! ——经典迷宫问题
目录 前言 思路 一.先创建迷宫 代码演示 输出效果为 二.在方法中使用递归回溯思想解决鼠鼠出迷宫 演示 三.代码 + 结果演示 输出结果 四.更改路线后再次尝试 五.测试回溯现象 总结 前言 迷宫题 ...
- 国庆七天乐,写博也快乐之小程序个人中心精美样式分享(登录、天气功能、天气动态背景变换、iconfont阿里巴巴、个人中心代码演示)
hello,大家国庆快乐~今天是国庆节第三天啦,你有好好学习吗?
- 国庆七天乐——第一天
20171001 所学内容:分治倍增,搜索模拟,位运算+考试 [时间复杂度] 表示运行时间的增长趋势 T(N)=T(N/2)+O(1) 二分查找 T(N)=2*T(N/2)+O(1) 线段树的节点个 ...
- 国庆七天乐 Day5
今天做的是第五届河南省省赛,我挫到爆了,只出了三题,都是水题,个人赛垫底. 先总结一下,今天写最水的A题居然WA了两次,关键是调了半个小时,浪费了不少时间,也影响了心情.然后做的是同样水的 F题,还好 ...
- 国庆七天乐 Day7
今天做的是湖南省2010年省赛题,悲催的只出了四题...今年省赛堪忧! 先做Codeforce去了... A:汽水瓶 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十 ...
- 国庆七天乐,写博也快乐之微信小程序天气预报+根据天气自动变换背景图实战(使用和风天气API)
hello,大家好,这里是X大魔王,先提前祝各位国庆节快乐
- 【20191001】国庆七天长假安排
[20191001]国庆七天长假安排 1. 作息时间表 2. 七天目标 (1)学习:将 Androi Audio 模块 从上层Java apk 到 kernel底层硬件 整个流程学懂 (2)锻炼:全身 ...
- 第七章第三十一题(合并两个有序列表)(Merge two ordered tables)
#第七章第三十一题(合并两个有序列表)(Merge two ordered tables) **7.31(合并两个有序列表)编写下面的方法,将两个有序列表变成一个新的有序列表. public stat ...
- 第七章第三十六题(游戏:八皇后问题)(Game: Eight Queens)
第七章第三十六题(游戏:八皇后问题)(Game: Eight Queens) ***7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能互相攻击(即没有两个皇后是在 ...
最新文章
- 论新时代软件测试人员的工作之道(四)自动化测试之单元及集成测试
- 网络推广外包——企业委托网络推广外包公司提高网站流量和访问量
- linux 守护进程_Linux 守护进程
- 代理模式在Spring 源码中的应用
- 每日一题(易错):这条SQL语句,有什么作用?
- 我的内核学习笔记16:海思Hi3516平台PWM使用记录
- linux终端输入lsblk无命令,lsblk
- java 什么是内部类_讨论Java中的内部类是什么?
- [开发笔记]-使用jquery获取url及url参数的方法
- YARN REST API
- 设备管理器里“SM总线控制器”、“其它PCI桥设备”驱动有问题
- oracle sql格式化 补零,sql语句格式化数字(前面补0)、替换字符串
- 【ArcGIS小技巧视频教程】(5):在ArcGIS中挂接其他数据
- 研究生跟了一个很棒的导师是种怎样的体验?
- 文件模式为 rw-r r linux,在Linux中,file.sh文件的权限为-rw-r--r-
- linux ps1 日期格式,Linux下bash的PS1
- 树莓派Linux开机使用root自动运行python的pyqt文件
- K近邻思想解决字体反爬
- Flutter syncfusion_flutter_charts 饼图PieSeries使用
- H5音频处理——踩坑之旅
热门文章
- ReentrantLock类源码解析
- 大数据-HDFS文件系统是什么
- Go Web编程--使用bcrpyt哈希用户密码
- Laravel核心解读--Contracts契约
- Laravel核心解读--控制器 1
- 如何在Linux开启HTTP服务,小技巧:如何快速开启一个静态 HTTP 服务?
- mongodb使用指南
- MySQL10061错误Access denied for user root@localhost(Windows下)
- [HDFS Manual] CH4 HDFS High Availability Using the Quorum Journal Manager
- 手机monkey测试BUG重现及解决方法