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的范围就限制在了每个方块内了,减少了计算量

【区间动态规划】

  1. 多边形表达式(环)

先化简:已知表达式,求加括号后的最大值

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),这样就可以依次遍历了(破环成链经典做法)

  1. 取数问题

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)]

  1. 合并果子 (堆)à哈夫曼编码

找到一个编码(无歧义)方式,试每个字符串的长度*出现次数的和最小。

实现方法就是维护一个每次合并前k小的优先队列

  1. 合并石子(相邻)

f[i][j]=f[i][k]+f[k+1][j]+s[i]+s[j];

  1. 合并石子+ 任意合并相邻2到n堆,求最少能量的消耗

脑筋急转弯解法:直接全部合并就好了。

  1. 合并石子++ 每次任意合并至少k堆,求最少能量的消耗

依旧是维护一个优先队列,但是要在队列末尾补0,来保证一定能实现k堆的合并且不影响答案。(小技巧)

  1. 删数游戏

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

国庆七天乐——第三天相关推荐

  1. 国庆七天乐,要猛! ——经典迷宫问题

    目录 前言 思路 一.先创建迷宫 代码演示 输出效果为 二.在方法中使用递归回溯思想解决鼠鼠出迷宫 演示 三.代码 + 结果演示 输出结果 四.更改路线后再次尝试 五.测试回溯现象 总结 前言 迷宫题 ...

  2. 国庆七天乐,写博也快乐之小程序个人中心精美样式分享(登录、天气功能、天气动态背景变换、iconfont阿里巴巴、个人中心代码演示)

    hello,大家国庆快乐~今天是国庆节第三天啦,你有好好学习吗?

  3. 国庆七天乐——第一天

    20171001 所学内容:分治倍增,搜索模拟,位运算+考试 [时间复杂度] 表示运行时间的增长趋势 T(N)=T(N/2)+O(1)  二分查找 T(N)=2*T(N/2)+O(1) 线段树的节点个 ...

  4. 国庆七天乐 Day5

    今天做的是第五届河南省省赛,我挫到爆了,只出了三题,都是水题,个人赛垫底. 先总结一下,今天写最水的A题居然WA了两次,关键是调了半个小时,浪费了不少时间,也影响了心情.然后做的是同样水的 F题,还好 ...

  5. 国庆七天乐 Day7

    今天做的是湖南省2010年省赛题,悲催的只出了四题...今年省赛堪忧! 先做Codeforce去了... A:汽水瓶 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十 ...

  6. 国庆七天乐,写博也快乐之微信小程序天气预报+根据天气自动变换背景图实战(使用和风天气API)

    hello,大家好,这里是X大魔王,先提前祝各位国庆节快乐

  7. 【20191001】国庆七天长假安排

    [20191001]国庆七天长假安排 1. 作息时间表 2. 七天目标 (1)学习:将 Androi Audio 模块 从上层Java apk 到 kernel底层硬件 整个流程学懂 (2)锻炼:全身 ...

  8. 第七章第三十一题(合并两个有序列表)(Merge two ordered tables)

    #第七章第三十一题(合并两个有序列表)(Merge two ordered tables) **7.31(合并两个有序列表)编写下面的方法,将两个有序列表变成一个新的有序列表. public stat ...

  9. 第七章第三十六题(游戏:八皇后问题)(Game: Eight Queens)

    第七章第三十六题(游戏:八皇后问题)(Game: Eight Queens) ***7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能互相攻击(即没有两个皇后是在 ...

最新文章

  1. 论新时代软件测试人员的工作之道(四)自动化测试之单元及集成测试
  2. 网络推广外包——企业委托网络推广外包公司提高网站流量和访问量
  3. linux 守护进程_Linux 守护进程
  4. 代理模式在Spring 源码中的应用
  5. 每日一题(易错):这条SQL语句,有什么作用?
  6. 我的内核学习笔记16:海思Hi3516平台PWM使用记录
  7. linux终端输入lsblk无命令,lsblk
  8. java 什么是内部类_讨论Java中的内部类是什么?
  9. [开发笔记]-使用jquery获取url及url参数的方法
  10. YARN REST API
  11. 设备管理器里“SM总线控制器”、“其它PCI桥设备”驱动有问题
  12. oracle sql格式化 补零,sql语句格式化数字(前面补0)、替换字符串
  13. 【ArcGIS小技巧视频教程】(5):在ArcGIS中挂接其他数据
  14. 研究生跟了一个很棒的导师是种怎样的体验?
  15. 文件模式为 rw-r r linux,在Linux中,file.sh文件的权限为-rw-r--r-
  16. linux ps1 日期格式,Linux下bash的PS1
  17. 树莓派Linux开机使用root自动运行python的pyqt文件
  18. K近邻思想解决字体反爬
  19. Flutter syncfusion_flutter_charts 饼图PieSeries使用
  20. H5音频处理——踩坑之旅

热门文章

  1. ReentrantLock类源码解析
  2. 大数据-HDFS文件系统是什么
  3. Go Web编程--使用bcrpyt哈希用户密码
  4. Laravel核心解读--Contracts契约
  5. Laravel核心解读--控制器 1
  6. 如何在Linux开启HTTP服务,小技巧:如何快速开启一个静态 HTTP 服务?
  7. mongodb使用指南
  8. MySQL10061错误Access denied for user root@localhost(Windows下)
  9. [HDFS Manual] CH4 HDFS High Availability Using the Quorum Journal Manager
  10. 手机monkey测试BUG重现及解决方法