子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问有多少种方案可以使得这个新串与字符串 B 相等?注意:子串取出 的位置不同也认为是不同的方案. [输入格式] 输入文件名为 substring.in. 第一行是三个正整数 n,m,k,分别表示字符串 A 的长度,字符串 B 的长度,以及问…
思路: f[i][j]表示n1串第i个与n2串第j个且以j结尾的LCIS长度. 很好想的一个DP. 然后难点是优化.这道题也算是用到了DP优化的一个经典类型吧. 可以这样说,这类DP优化的起因是发现重复计算了很多状态,比如本题k的那层循环. 然后就可以用maxl标记搞一下,将O(n^3)变成O(n^2). #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> usi…
取数字(dp优化) 给定n个整数\(a_i\),你需要从中选取若干个数,使得它们的和是m的倍数.问有多少种方案.有多个询问,每次询问一个的m对应的答案. \(1\le n\le 200000,1\le m\le 100,1\le q\le 30,-10^9\le a_i\le 10^9\). 首先有一个暴力dp:\(f[i][j]\)表示选到第i个数,和mod m是j的方案数.但是显然,这个dp是\(O(nm)\)的,然后就tle了. 换一个思路dp?由于我们只需要一个数模m的值,可以先把所有数…
该文是对dp的提高(并非是dp入门,dp入门者请先参考其他文章) 有时候dp的复杂度也有点大...会被卡. 这几次blog大多数会讲dp优化. 回归noip2017PJT4.(题目可以自己去百度).就是个很好的案例.那题是个二分套dp如果dp不优化复杂度O(n^2logn)还能拿60分(CCF太仁慈了,如果是我直接给10分). 正解加上个单调队列(其实是sliding window)O(nlogn) 我们发现,此类dp是这样的 状态i是由[l,r]转移过来的.且i在向右移动的过程中,[l,r]一…
题目: https://loj.ac/problem/6171 分析: 设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数 那么 a[i][k]表示i点为存档点,从i点走到k点(正确节点)的期望步数(中间没有其它存档点) 那么a[i][j]可以递推预处理出 其中g[v]表示从一个错误节点v开始走,期望走g[v]步会读档 解方程可以解出 s[j-1]就是点j-1出去的所有错误儿子的g[v]之和 那么接下来只要知道如何求g[v]就行了…
常见的DP优化类型 1单调队列直接优化 如果a[i]单调增的话,显然可以用减单调队列直接存f[j]进行优化. 2斜率不等式 即实现转移方程中的i,j分离.b单调减,a单调增(可选). 令: 在队首,如果g[j,k]>=-a[i],那么j优于k,而且以后j也优于k,因此k可以重队列中直接删去.在队尾,如果x<y<z,且g[x,y]<=g[y,z],也就是说只要y优于x一定可以得出z优于y的,我们就删去y. 经过队尾的筛选,我们在队列中得到的是一个斜率递减的下凸包,每次寻找从上往下被-…
[学习笔记]动态规划-各种 DP 优化 [大前言] 个人认为贪心,\(dp\) 是最难的,每次遇到题完全不知道该怎么办,看了题解后又瞬间恍然大悟(TAT).这篇文章也是花了我差不多一个月时间才全部完成. [进入正题] 用动态规划解决问题具有空间耗费大.时间效率高的特点,但也会有时间效率不能满足要求的时候,如果算法有可以优化的余地,就可以考虑时间效率的优化. [DP 时间复杂度的分析] \(DP\) 高时间效率的关键在于它减少了"冗余",即不必要的计算或重复计算部分,算法的冗余程度是决定…
1305 Freda的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description Freda要到Rainbow的城堡去玩了.我们可以认为两座城堡位于同一条数轴上,Freda的城堡坐标是0,Rainbow的城堡坐标是N.正常情况 下,Freda会朝着同一个方向(即Rainbow的城堡相对于Freda的城堡的方向)走若干步之后来到Rainbow的城堡,而且步长都为1或2.可 是,今天Freda在途中遇见了来自上海的小猫Resodo,惊…
目录 注意本文未完结 写在前面 矩阵快速幂优化 前缀和优化 two-pointer 优化 决策单调性对一类 1D/1D DP 的优化 \(w(i,j)\) 只含 \(i\) 和 \(j\) 的项--单调队列优化 单调队列优化多重背包 \(w(i,j)\) 只含 \(i,j\) 和 \(ij\) 的项--斜率优化 决策单调性适用的原理--四边形不等式与决策单调性 注意本文未完结 写在前面 ACM 训练(复习)的时候重新学习了一下常见的 DP 转移的优化技巧,在学习的同时也有一些自己的理解,便一并总…
题意:        给你一个矩阵,让你在里面找到一个最大的f矩阵.. 思路:       三种方法ac这到题目;  方法(1) 以宽为主,暴力    开一个数组sum[i][j],记录当前这个位置的前面有多少个连续的f,更新完这个数组时候在枚举每一个点,只处理最后一列或者sum[i][j+1] =0 的点,因为只有这样的点才可能是最大的,对于每一个要处理的点,直接往上跑和往下跑,跑的条件是sum[i][j] <= sum[k][j] (k是上跑或下跑的数),然后找到一共跑了多少个,当前的最大就…
题意       给你一些点( <= 50),让你找到k个点,使得他们之间的最小距离最大. 思路:       求最小的最大,我们可以直接二分去枚举距离,但是要注意,不要去二分double找距离,要知道,最后的答案肯定是其中某个点的两点距离,所以我们直接把所有点的距离求出来,放一个数组里面,然后sort下,然后去二分这个数组的下标,根据下标找距离,这样可以节省点时间(这种情况这针对于某些题目,如果点非常多,n*(n-1)/2距离的种类是有可能很多,这样还不如直接二分double快点,毕竟二分是l…
[前言] 在补Codeforce的DP时遇到一个比较新颖的题,然后在知乎上刚好 hycc 桑也写了这道题的相关题解,这里是作为学习并引用博客的部分内容 这道题追根溯源发现2016年这个算法已经在APIO2016烟花表演与Codeforces 713C引入,自那之后似乎便销声匿迹了.相关题型数量也较少,因而在这里结合前辈们的工作做一些总结.---by hycc 问题引入:Codeforces 713C 题目链接:Here 题意: 给定 \(n\) 个正整数 \(a_i\) ,每次操作可以选择任意一…
标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 \(f_{i,0/1}\) 分别表示不选(\(0\))/ 选(\(1\))点 \(i\) 的最大权值,那么有 \(f_{i,0}=\sum_{x\in S_i}\max(f_{x,0},f_{x,1}),f_{i,1}=v_i+\sum_{x\in S_i}f_{i,0}\). 如果加上修改操作,那…
0. 前言 写完这篇文章后发现自己对于 DP 的优化一窍不通,所以补了补 DP 的一些优化,写篇 blog 总结一下. 1. 单调队列/单调栈优化 1.2 算法介绍 这应该算是最基础的 DP 优化方法了. 顾名思义,单调队列/单调栈优化 DP 就是保持容器内元素的单调性,以达成减少冗余状态的目的. 举单调队列的例子来说,当一个元素的两种属性(例如下标和权值)都优于另一元素时,就可以用此元素更换掉另一元素.这也正是 OI 界流传说法"当一个人比你小且比你强时,你就被弹出单调队列了"的原理…
收录一些比较冷门的 DP 优化方法. 1. 树上依赖性背包 树上依赖性背包形如在树上选出若干个物品做背包问题,满足这些物品连通.由于 01 背包,多重背包和完全背包均可以在 \(\mathcal{O}(V)\) 的时间内加入一个物品,\(\mathcal{O}(V ^ 2)\) 的时间内合并两个背包,所以不妨设背包类型为多重背包. 先考虑一个弱化版问题.给定一棵有根树,若一个节点被选,则它的父亲必须被选. 显然存在一个 \(\mathcal{O}(nV ^ 2)\) 的树形 DP 做法,它能求出…
前言 本文选题都较为基础,仅用于展示优化方式,如果是要找题单而不是看基础概念,请忽略本文. 本文包含一些常见的dp优化("√"表示下文会进行展示,没"√"表示暂时还咕着):前缀和优化(√).单调队列优化(√).斜率优化(√).四边形不等式优化.数据结构优化-- 由于写本文主要是记录蒟蒻的dp优化学习过程,所以可能很不完善,也会有很多错误 (?) .推荐看巨佬的:[学习笔记]动态规划-各种 DP 优化 - 辰星凌 1. 前缀和优化dp 进行状态转移时,如果发现需加上前…
题面 一眼dp 设\(f_i\)表示前\(i\)个且\(i\)必须选的最大功率 有 \(f _i= max_{1 \leq j < i,A_i - A_j > X_j} \{f_j \}+p_i\) 下面的条件 \(A_i - A_j > X_j\) 相当于 \(X_j + A_j < A_i\) \(X_j + A_j +1 \leq A_i\) 设\(g(i)= X_i +A_i +1\) 发现对于一个\(i\)来说\(g(i)\)是确定的 那我们可以用一个数据结构来维护 考场…
传送门 考试5分钟写完. 如果没这题今天多半爆零了(汗 直接二分出合法的转移范围. 然后用后面的状态更新前面的就可以了. 代码…
1 当贪心不再起效的时候 对于换零钱问题,最简单也是性能最好的方法就是贪心算法.可是贪心算法一定要满足面值相邻两个零钱至少为二倍关系的前提条件.例如1,2,5,10,20……这样的零钱组应用贪心最简单:可对于1,3,4,5,6,10……这样的零钱组就不起效了:当目标总值是12的时候,应用贪心算法:答案是10x1+1x2,共3张,可正确答案应该是6x2共两张. 那怎么解决呢?这样的问题符合动态规划的特点:任何一个状态可以由前边的状态计算而得. 定义问题(明确需求):一组不重复且升序排列零钱面额数组…
Count the string Problem Description It is well known that AekdyCoin is good at string problems as well as number theory problems. When given a string s, we can write down all the non-empty prefixes of this string. For example:s: "abab"The prefi…
3851: 2048 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 22  Solved: 9[Submit][Status] Description Teacher Mai is addicted to game 2048. But finally he finds it's too hard to get 2048. So he wants to change the rule: You are given some numbers. Every…
1138: [POI2009]Baj 最短回文路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 161  Solved: 48[Submit][Status] Description N个点用M条有向边连接,每条边标有一个小写字母. 对于一个长度为D的顶点序列,回答每对相邻顶点Si到Si+1的最短回文路径. 如果没有,输出-1. 如果有,输出最短长度以及这个字符串. Input 第一行正整数N和M ( 2 ≤ N ≤ 400 , 1 ≤ M ≤…
1.二分优化 (使用二分查找优化查找效率) 典型例题:LIS dp[i]保存长度为 i 的上升子序列中最小的结尾,可以用二分查找优化到nlogn 2.数学优化 (通过数学结论减少状态数) 例题1:hdu4623 题解:http://www.cnblogs.com/oneshot/p/4064852.html 例题2:usaco4.11 题解 大意是求10个数及其倍数最大不能表示的数 有数论结论证明对于互质的p,q,最大不能表示的数不会超过p*q,所以这个题就成了有上限(256*256)的问题了,…
入口 A(fzu 1894) 普通的单调队列,trick是进队判断的符号选取(>=wa , >ac). B(poj 2823) 没什么好说的 ,坑爹poj g++,tle ;c++,ac. C(hdu 3415) 尝试封装了一下单调队列...感觉也没有方便多少. #define maxn 100010 #define INF 1000000000 ],p[maxn<<],n,k; struct Que { ],front,tail,cmp; ;} void ins(int id)…
Problem Description Lee has a string of n pearls. In the beginning, all the pearls have no color. He plans to color the pearls to make it more fascinating. He drew his ideal pattern of the string on a paper and asks for your help.  In each operation,…
Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to work for a long time and it will certainly wear and tear, so Zero use a cost to evaluate this degree. One day…
转自PomeCat: "DP的斜率优化--对不必要的状态量进行抛弃,对不优的状态量进行搁置,使得在常数时间内找到最优解成为可能.斜率优化依靠的是数形结合的思想,通过将每个阶段和状态的答案反映在坐标系上寻找解答的单调性,来在一个单调的答案(下标)队列中O(1)得到最优解." https://wenku.baidu.com/view/b97cd22d0066f5335a8121a3.html "一些试题中繁杂的代数关系身后往往隐藏着丰富的几何背景,而借助背景图形的性质,可以使那些…
(1) 最简单的4^10*N的枚举(理论上20%) (2) 优化优化200^3*N的枚举(理论上至少50%) (3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%) (4) 再剩下的,卡常数+卡常数+一个小优化(自己想吧,有可能被卡一个点) (5) 如果还没有过,dfs中可能有重复的状态,用链式前向星优化一下,就差不多了 (6) 以上属于乱搞,正解在下面 (7) O(3^10*N),我们知道,设,我们更新第i行的状态,那么如果第i-1行的第j个位置不能被选取,则第i-…
题目大意 n件物品,第i件hi高,有ci件,最高的一件不能超过ai的高度.问最高能堆多高 输入: 第一行,一个n 接下来每一行,为hi,ai,ci 输出,最高堆多高 样例输入: 37 40 35 23 82 52 6 样例输出: 48 (从下到上:3个2号,3个1号,6个3号) 分析: 我们很容易想到要先放限制高度小的,那我们就先按限制高度从小到大排序. 然后我们可以发现,这个和多重背包很像,“物重”“价值”都为hi,数量为ci 设dp[i][j]为用前i件,花费高度j的盒子,最高能堆多高(显然…
题目链接:https://vjudge.net/problem/HDU-4734 题意:定义一个十进制数AnAn-1...A1的value为An*2n-1+...+A1*20,T组样例(<=1e4),每组样例给出a.b,求出[0,b]中value小于等于a的value的数的个数. 思路:数位dp,第一能想到将Ai*2i-1的和作为状态,即dp[len][sum]表示到长度为len的数中value为sum的数的个数,最后判断sum<=value(a)来确定是否满足条件.但是问题来了,我们会发现这…