csps 线性dp
合唱队形
正反分别求一遍最长上升子序列,然后枚举中间的最高点,计算出来队列里面的最多人,然后就可以知道需要出列的最少人。
过河
tips:两个互质的数字 p,q,他们所不能拼出来的最小的数字是 \((p-1)(q-1) - 1\)。
我们可以用 \(f[i]\) 表示经过长度 i 之间,我们所踩石头的最小数量。
但是整个区间的长度过于长(1e9)我们没有办法放在下标里面,我们就可以用上面的 tip 来解决问题。我们可以知道,如果两个石子之间的距离超过了 100 (更准确地说是 91) 那么我们就可以把他给缩放成 100。这样子就解决了这个长度过长的问题。
转移方程:
\]
传纸条
题目相当于是让我们跑两次求路径和的最大值。这样的话,我们可以考虑同时跑这两个,对于这个图的一个转态表示,首先想到的应该是思维分别存储 x1, y1, x2, y2 但是我们可以通过经验得到,我们对于同一步来说,x 与 y 的和是一个定值,所以我们就可以简化成三维,用 \(f[k][x1][x2]\) 来表示。
而且我们不难看出这个路线是不能有交叉的(但是可以有交点)。
我们在计算转移的时候从四个方向转移就行了,从上面过来,从左面过来。组合。四种转移。其中取到的格子中的数,要注意判断是不是在同一个位置,以免重复计算。
对于 x1 和 x2 的循环边界要注意是 \(\max(1, k-m)\) 不可能总共 m 列然后走出框去
乌龟棋
题目告诉了我们使用的卡片有四种,那我们不妨就按照这四种卡片的使用数量来表示我们所能取到的数字的最大值。即一个四维状态 \(f[A][B][C][D]\) 分别表示每个卡片分别用了这么多卡片之后我们所能获得的分数的最大值。
我们也只需要枚举每个卡片 A,B,C,D 的使用个数就行了。
\]
子串
我们用 \(f[i][j][k]\) 表示 我们已经用 A 中前 i 个字母表示了 B 中的 前 j 个字母,且已经分成了 k 段的方案数。
但是我们的空间复杂度会炸掉,就要考虑空间优化。
空间优化的方法:
- 如果只跟上一步有关,可以让第一维变成 2 使用滚动数组增加空间效率。
- 如果第一维只跟上一层有关,之后的几维都是从它之前的状态转移过来,我们就可以省去第一维,然后将第二维用倒序的方法进行更新。
先分析三维的:对于一个已经有了长度为 t 的一个串 A 我们首先可以写出来转移方程。
\]
然后我们再列出 i - 2 的情况,发现有很大一部分是会被重复计算的。
所以我们可以用前缀和来维护这个值。
\]
我们可以用前缀和来提前处理出来后面这个求和
\]
然后我们的式子就变成了
\]
我们再用上叙的方法,就可以切掉这题。
Emiya家今天的饭
状态表示:只用前 i 种烹饪方法,做了 j 道菜的方案数。
状态转移:$$f[i][j] = f[i][j-1] + f[i-1][j-1] * \sum_{i=1}^{m} a[i]$$
csps 线性dp的更多相关文章
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
- 『最大M子段和 线性DP』
最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...
- 『最长等差数列 线性DP』
最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...
- cf909C 线性dp+滚动数组好题!
一开始一直以为是区间dp.. /* f下面必须有一个s 其余的s可以和任意f进行匹配 所以用线性dp来做 先预处理一下: fffssfsfs==>3 0 1 1 dp[i][j] 表示第i行缩进 ...
随机推荐
- CF1810G The Maximum Prefix
经典套路. 题意 你将随机生成一个长度为 \(k\) 的数组 \(a\),其中 \(a_i\) 有 \(p_i\) 概率为 \(1\),否则为 \(-1\).定义其前缀和数组 \(s_i = \sum ...
- 逍遥自在学C语言 | 指针函数与函数指针
前言 在C语言中,指针函数和函数指针是强大且常用的工具.它们允许我们以更灵活的方式处理函数和数据,进而扩展程序的功能. 本文将介绍指针函数和函数指针的概念,并讲解一些常见的应用示例. 一.人物简介 第 ...
- 逍遥自在学C语言 | 函数初级到高级解析
前言 函数是C语言中的基本构建块之一,它允许我们将代码组织成可重用.模块化的单元. 本文将逐步介绍C语言函数的基础概念.参数传递.返回值.递归以及内联函数和匿名函数. 一.人物简介 第一位闪亮登场,有 ...
- (一)centos7下如何搭建Nginx和FastDFS文件管理-环境搭建
一.关于FastDFS 1.FastDFS简介 FastDFS(Fast Distributed File System)是一个开源的分布式文件系统,旨在解决大规模文件存储和访问的问题,例如图片.音视 ...
- matlab 整数提升为正整数幂
matlab 整数提升为正整数幂 在使用matlab 的gui界面绘制时报的错误, 是因为之前数据有非double类型的数据,但是有的数据看起来确实是double类型的,但是程序还是报错跑不下去 解决 ...
- PREDIV与PLLMUL配置应用笔记
下图为CH32V305/307和CH32F205/207时钟树框图,在此,以CH32V307VCT6芯片,外置25MHz晶振为例,简述图中PREDIV与PLLMUL的配置方法,最终实现144MHz系统 ...
- Vue中 router与route的区别
$route对象 该对象表示当前的路由信息,包含当前URL解析得到的信息.包含当前的路径,参数,query对象等.其常用方法如下所示: $route.path 字符串,对应当前路由的路径,总是解析为绝 ...
- Blazor前后端框架Known-V1.2.11
V1.2.11 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...
- 使用supervisor守护Prometheus进程
使用supervisor守护Prometheus进程 目录 使用supervisor守护Prometheus进程 安装supervisor 安装Prometheus监控系统 配置supervisor ...
- Android13冻结进程分析:如何提高设备性能和用户体验
Android13冻结进程分析:如何提高设备性能和用户体验 本文介绍了Android13中的冻结进程功能,它是一种重要的资源管理策略,可以提高系统性能和稳定性,同时最大限度地节省设备的资源和电池消耗. ...