【Luogu】P3847调整队形(DP)】的更多相关文章

题目链接 DP果真是考思维啊 增加一个数的操作等价于删掉那个不和谐的数的操作. 所以1.2操作可以忽略. 剩下3.4操作,则可以设计f[i][j]是将区间[i,j]变成回文序列需要的操作数. if(a[i]==a[j]) f[i][j]=f[i+1][j-1]; 如果不一致的话,考虑改.删左边.删右边三种操作. #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #inc…
P3847 [TJOI2007]调整队形 题目背景 学校艺术节上,规定合唱队要参加比赛,各个队员的衣服颜色不能很混乱:合唱队员应排成一横排,且衣服颜色必须是左右对称的. 例如:“红蓝绿蓝红”或“红蓝绿绿蓝红”都是符合的,而“红蓝绿红”或“蓝绿蓝红”就不符合要求. 合唱队人数自然很多,仅现有的同学就可能会有3000个.老师希望将合唱队调整得符合要求,但想要调整尽量少,减少麻烦.以下任一动作认为是一次调整: 题目描述 1.在队伍左或右边加一个人(衣服颜色依要求而定): 2.在队伍中任两个人中间插入一…
题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他们的身高分别为T_1,T_2,…,T_KT1​,T2​,…,TK​, 则他们的身高满足T_1<...<T_i>T_{i+1}>…>T_K(1 \le i \le K)T1​<...<Ti​>Ti+1​>…>TK​(1≤i≤K). 你的任务是,已知所有…
题目背景 loidc,LOI中的传说级哲♂学家,曾经创造一天内入坑maxlongint个弃坑0x7fffffff个的神奇纪录.目前,loidc最喜欢的游戏就是地下城与勇♂士. 题目描述 Loidc是一个勤奋的孩子. 他每天都会勤奋的搬砖刷疲劳,每天都会期待着各种BOSS给他爆点什么神奇的东西(例如魔剑..),但是每次刷远古总会坑到连门票钱也赚不回来. 最近loidc新技能get√ 他每天都会朗诵一遍线段树,将自己升级为”Deep Dark Fantasy”模式(其实是每天去给腾讯爹送钱)下才去搬…
[luogu]P1070 道路游戏 题目描述小新正在玩一个简单的电脑游戏.游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编号为1~n,因为马路是环形的,所以第 n 个机器人工厂和第 1 个机器人工厂是由一段马路连接在一起的.小新将连接机器人工厂的这 n 段马路也编号为 1~n,并规定第 i 段马路连接第 i 个机器人工厂和第 i+1 个机器人工厂(1≤i≤n-1),第 n 段马路连接第…
不用FFT的多项式(大雾) 题目链接: https://www.luogu.org/problemnew/show/P5469 (这题在洛谷都成绿题了海星) 题解: 首先我们考虑,一个序列位置最右边的最大值可以走遍整个序列,并且其余任何点都不能跨过这个位置. 所以我们可以区间dp, \(dp[l][r][x]\)表示区间\([l,r]\)最大值不超过\(x\)的方案数,枚举最大值点\(mid\)及其值\(k\), \(dp[l][r][x]=\sum_{mid}\sum_{k}dp[l][mid…
题面 传送门:https://www.luogu.org/problemnew/show/P2014 Solution 这是一道十分经典的树形DP题,这种类型的树形DP有一种很普遍的解法. 首先,观察题目,我们把这道题转换一下:给定一颗树,选出包含1号节点(根)的一颗子树,使得点权和最大. 我们可以这样子定义状态: 设f[i][j] 表示以i为根节点的子树,选出j个节点,所能达到的最大点权值. 对于二叉树来说,转移很显然,就是枚举左子树分配多少个节点,就可以对应的得出右子树能分配到多少个节点,对…
题面 传送门:https://www.luogu.org/problemnew/show/P1613 Solution 挺有意思的一道题. 题面已经挺明显的描述出了这题的主要思想:倍增. 先这样想,我们可以把这题这样建模:有一堆点,若两个点之间的距离之和可以达到2的n次方,那么这两个点可以用1的时间相互到达. 也就是说,我们把距离能为2的n次方的点对用边权为1的边连上,再做一次最短路径,就可以求出答案了. 接下来问题就是如何求出每两个点是否能以2的n次方的时间相互到达. 考虑使用DP. 我们设f…
f[i][j][k]分别代表1-i-1个人全部打完饭时i及其后7个人的状态为j时最后一个打饭的人为i+k的状态下所用的最小时间 当i已经打过饭时 即 j&1 那么 f [i] [j>>1] [k+1] =min(~, f[i] [j] [k]); 如果没有那么枚举其后的打饭的人同时注意要保证忍耐度的条件,所以利用r找i+h+b[i+h]的最小值,也就是i所能选取的最远边界 如果当前循环的h已经超过范围r 那么结束此次更新答案 否则 f[i] [j|(1<<h)] [h] =…
题目链接 区间 DP 的经典模型之一. 题意是将整个串通过四种操作变成一个回文串,根据套路,不难设计出 dp[i][j] 表示为使区间 [i, j] 成为回文串的最少操作次数. 先判断 a[i] 是否等于 a[j],如果相等,那么: f[i][j] = max(f[i][j], f[i + 1][j - 1]) 如果不相等,则改变一个: f[i][j] = max(f[i][j], f[i + 1][j - 1] + 1) 其实可以发现第一.二种操作都和第三种等价,这三种转移可以表示为: f[i…
dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) using namespace std; ; ; inline int read(){ ,f=;char ch=getchar(); ;ch=getchar();} )+(x<<)+(ch^);ch=getchar();} return x*f;} int n,m,t,f[N]…
这道题的DP的状态设计的很有想法啊. 假如我们一行一行来选择的话,状态将会极其复杂. 如果一列一列来看的话,比如你想选aij,那么第i列的前j个都要选,并且第i+1列的前j-1个都要选. 于是状态就很好设计了,定义dp[n][i][j]表示还剩下n个要选的砖块,当前选择第i列的前j个所能达到的最大分值. 那么dp[n][i][j]=max(dp[n-j][i+1][k]+sum[i][j])(j-1<=k<=n-i). 记忆化搜索一下就OK了. # include <cstdio>…
P1067 合唱队形 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2004 提高组 第三道 描述     N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 你的任务是,已知所有N位同学…
题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形. 输入输出格式 输入格式: 输入文件chorus.in的第一行是一个整数N(2<…
题目传送门 题目大意:给你一个序列,求子序列为等差数列的子序列个数.序列长度$n<=2000$,最高的塔高$v<=20000$. 这种计数类的题,大概就是dp的套路了⑧.开始设计的是一个错误的状态:设$f[i][j]$为到前$i$个塔选了$j$个的方案数,但是我们再看一看就会发现这是错的,因为等差数列啊,我们并没有考虑公差鸭.所以我们再设计一个状态:设$f[i][j]$表示到第$i$个塔为止,公差为$j$的方案数.开始想的是$O(n^3)$算法 ,还要枚举公差,但是后来发现不需要特意枚举公差,…
题目描述 Jimmy最近迷上了一款叫做方块消除的游戏.游戏规则如下:n个带颜色方格排成一列,相同颜色的方块连成一个区域(如果两个相邻方块颜色相同,则这两个方块属于同一区域).为简化题目,将连起来的同一颜色方块的数目用一个数表示. 例如,9 122233331表示为 4 1 2 3 1 1 3 4 1 游戏时,你可以任选一个区域消去.设这个区域包含的方块数为x,则将得到x^2个分值.方块消去之后,其余的方块就会竖直落到底部或其他方块上.而且当有一列方块被完全消去时,其右边的所有方块就会向左移一格.…
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的食物准备填饱肚子.gw希望能在T时间内做出最美味的食物,但是这些食物美味程度的计算方式比较奇葩,于是绝望的gw只好求助于你了. 题目描述 一共有n件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间. 众所周知,gw…
P2679 子串 题意 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\)中出现的顺序依次连接起来得到一个新的字符串.请问有多少种方案可以使得这个新串与字符串\(B\)相等? 注意:子串取出的位置不同也认为是不同的方案. 输入输出格式 输入格式: 第一行是三个正整数\(n,m,k\),分别表示字符串\(A\)的长度,字符串\(B\)的长度,以及问题描述中所提到的\(k\…
P2066 机器分配 题面 题目背景 无 题目描述 总公司拥有高效设备 \(M\) 台,准备分给下属的 \(N\) 个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这 \(M\) 台设备才能使国家得到的盈利最大?求出最大盈利值.其中 \(M \leq 15, N \leq 10\) .分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数 \(M\) . 输入输出格式 输入格式: 第一行有两个数,第一个数是分公司数 \(N\) ,第二个数是设备台数 \(M\) .…
LINK:序列 考虑前20分 容易想到爆搜. 考虑dp 容易设\(f_{i,j,k,l}\)表示前i个位置 选了j对 且此时A选择了k个 B选择了l个的最大值.期望得分28. code //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<ctime> #include<cctype> #include<queue> #include<deq…
LINK:游园会 容易想到 设\(f[i][j][k][l]\)前i个字符 j表示状压的w个字符状态为j 长度<=k 匹配到了NOI的第l个位置的方案数. 不过只能得到30分. 考虑优化 其实优化就只能优化如何快速得到LCS 这个问题 \(3^15\cdot 15\)的状态量无法很难接受. 考虑降低这个状态量.考虑如果在一个自动机上 那么我们这个状态就可以表示匹配到了自动机上某个节点. 不过最长公共子序列自动机 并不存在. 考虑人为构造这个东西 考虑求两个串的最长公共子序列的dp. \(dp_{…
注意处理出两个数组: r[i] 能覆盖i点的区间的左端点最小值(覆盖左侧最远处) l[i] i不能覆盖的区间的左端点左端点最大值 在该区间内寻找用来更新f[i] 答案的 j 即 l[i]<= j <= r[i] 转移方程: f[i] = max (f[j] )+1: 利用单调队列维护滑动窗口 但是由于不定长,与一般的单调队列稍有区别,利用指针 j 将区间内的元素补充进队列中 #include<bits/stdc++.h> #define rep(i,x,y) for(registe…
f[i][j]表示在第i个垃圾,高度为j的最大生命值 转移分三部分: 如果j>=当前垃圾的高度,且两个垃圾间的时间小于等于上一个状态f[i-1][j-a[i].v]的生命值,则可以垫高度 如果j>=当前垃圾的高度,且两个垃圾间的时间小于等于上一个状态f[i-1][j]的生命值,则可以吃 如果j<当前垃圾的高度,且两个垃圾间的时间小于等于上一个状态f[i-1][j]的生命值,则可以吃 什么时候死的:f[i][0]相当于没有垫高度,拿这个状态再把现在的垃圾吃了,可能是最优解,与ans取一个m…
第一问求最长下降子序列,不提: 第二问:借鉴了最短路的方法??? 我们求出来了每个位置的最长下降子序列的长度,那么刻意这样这样转移 if f[i]==f[j]+1&&a[i]<a[j](i>j) 这代表f[i]可以由f[j]转移过来,所以 f[i]+=f[j] 但是会重复,所以当f[i]==f[j]&&a[i]==a[j]  时,说明没有发生任何转移,去掉一个. 初值 当f[i]==1时,c[i]=1; #include<iostream> #inc…
传送门 Solution \(f_{i,0}\) 表示以i节点为根的子树内,不选i号节点的最大独立集 \(f_{i,1}\)表示以i节点为根的子树内,选i号节点的最大独立集 \(g_{i,0}\) 表示以i节点为根的子树内,不选i号节点,不算它的重节点子树的最大独立集 \(g_{i,1}\) 表示以i节点为根的子树内,选i号节点,不算它的重节点子树的最大独立集 把矩阵乘法的加法改成max,乘法改成加法,仍然符合结合律. 先进行树链剖分,对于同一条链上的点,我们的更新可以写成如下的矩阵乘法: \[…
P2577 [ZJOI2005]午餐 题面 题目描述 上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的.另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的. \(THU \ ACM\) 小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍…
1.重叠子问题 2.能从小问题推到大问题 Dp: 设计状态+状态转移 状态: 1.状态表示: 是对当前子问题的解的局面集合的一种(充分的)描述.(尽量简洁qwq) ◦          对于状态的表示,要满足三条性质 ◦          1:具有最优化子结构:即问题的最优解能有效地从问题的子问题的最优解构造而来. ◦          2:能够全面的描述一个局面.一个局面有一个答案,而这个局面是需要一些参数来描述的. ◦          3:同时具有简洁性:尽可能的简化状态的表示,以获得更优…
一般DP 都是有模板的,先初始化,然后找到不同状态下数值的关系,使得某个状态可用另一个状态由一个固定的方式转移而来,列出状态转移方程,这就是DP: 例题 P1216 [USACO1.5]数字三角形 Number Triangles f[i][j]+=max(f[i-][j-],f[i-][j]); 方程 P1044 栈 f[i]+=f[j]*f[i-j-]; 方程 P2800 又上锁妖塔 f[i]=min(f[i-]+t[i],min(f[i-]+t[i-],f[i-]+t[i-])); 方程…
题目链接 luogu [TJOI2007]线段 题解 dp[i][0/1]第i行在左/右端点的最短路 瞎转移 代码 #include<bits/stdc++.h> using namespace std; inline int read() { int x= 0 ,f = 1; char c = getchar(); while(c < '0' || c > '9')c = getchar(); while(c <= '9' &&c >= '0')x =…
题面 luogu 题解 \(Cdq分治+dp\) \(mx[i],mn[i]\)分别表示第\(i\)位最大,最小能取到多少 那么有 \(j < i\) \(mx[j] \le a[i]\) \(a[j] \le mn[i]\) 然后就有了50分 \(O(n^2)\)的\(dp\) 上面那个东西是个三维偏序, \(Cdq\)优化一下即可. Code 50pts #include<bits/stdc++.h> #define LL long long #define RG register…