luogu 2592 区间dp】的更多相关文章

\(f_{i, j, a, b}\) 表示当前一共有 \(i\) 人排队, \(j\) 名男生,男生数目 - 女生数目为 \(a\), 女生数目 - 男生数目为 \(b\),\(a, b >= 0\) 转移显然 #include <bits/stdc++.h> const int N = 160, Mod = 12345678; int f[N << 1][N][25][25]; int n, m, k; int main() { std:: cin >> n &…
区间DP luogu 4290 明显的区间DP. 定义 dp[l][r][k]/*表示区间[l,r]能否凑成k(W,I,N,G)字符*/mp['W']=1;mp['I']=2;mp['N']=3;mp['G']=4; 之后选择比较好写的记忆化搜索去完成 记录1 记录2 记录3 AC码 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ],dp[][][],mp[],le…
题目链接 通过这题我发现我已经不会DP了 区间DP,f[i][j]是从左面转移来的,d[i][j]是从右面转移来的 然后DP方程是 ]) f[i][j]+=f[i+][j]; ][j]; f[i][j]%=mod; ]; ]) d[i][j]+=d[i][j-]; d[i][j]%=mod; 然后就是代码啦 #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> #inc…
题目链接 区间DP,因为中序遍历的性质:区间[l,r]的任何一个数都可以是该区间的根节点. 更新权值的时候记录区间的根节点,最后DFS输出. 见代码. #include<cstdio> #include<cctype> #include<algorithm> inline long long max(long long a,long long b){ return a>b?a:b; } inline long long read(){ ,f=; char ch=g…
题目传送门 做完A Game以后找道区间dp练练手...结果这题没写出来(哭). 和A Game一样的性质,从两边取,但是竟然还有天数,鉴于之前做dp经常在状态中少保存一些东西,所以这次精心设计了状态(不对的). 开始的naive想法:设f[i][j][0/1]为把第1~i / i~n的零食兜售完所得的最多钱,然后我们就会发现这个状态十分难转移. 水题还看了题解. 十分朴素的区间dp,和我在能量项链总结的如出一辙. 本题突破口:可以直接通过区间来得出当前是第几天!! Code #include<…
https://www.luogu.org/problemnew/show/P4170 一道简单的区间DP,注意读入 #include <bits/stdc++.h> #define up(i,l,r) for(int i = (l);i <= (r); i++) using namespace std; ][]; ]; int main() { // freopen("color.in","r",stdin); memset(f,0x7F,siz…
https://www.luogu.org/problemnew/show/P3147 此题与上一题完全一样,唯一不一样的就是数据范围; 上一题是248,而这一题是262144; 普通的区间dp表示状态表示法根本存不下, 这时我们就要想另外的状态表示法; #include <bits/stdc++.h> #define read read() #define up(i,l,r) for(int i = (l);i <=(r); i++) using namespace std; int…
https://www.luogu.org/problemnew/show/P3146 一道区间dp的题,以区间长度为阶段; 但由于要处理相邻的问题,就变得有点麻烦; 最开始想了一个我知道有漏洞的方程 ][j]) f[i][j] = max(f[i][k],f[k + ][j]); ); 可能f[i][k] = f[i][j],但他们可合并的并未相邻; 可以这样 #include <bits/stdc++.h> #define read read() #define up(i,l,r) for…
题目链接 BZOJ 洛谷 AC代码: 区间DP,f[i][j]表示消掉i~j需要的最少珠子数. 先把相邻的相同颜色的珠子合并起来. 枚举方法一样,处理一下端点可以碰撞消除的情况就行. 当然合并会出现问题,比如有多个同色珠子但是可以分配给两边分别匹配,比如:https://www.luogu.org/discuss/show/8416?page=1. 没办法 写不对. 注意颜色还可能是非正数. //1820kb 108ms #include <cstdio> #include <cctyp…
题目:https://www.luogu.org/problemnew/show/P1220 题意:给定n盏灯的位置和功率,初始时站在第c盏处. 关灯不需要时间,走的速度是1单位/秒.问把所有的灯关掉,最少功率是多少. 思路:看上去是区间dp还挺清楚的.因为关灯不需要时间,既然路过了就顺便关了吧.所以肯定是中间某一段的灯都被关了,两端各有一段亮着. 所以我们可以用$dp[i][j]$表示i~j号灯都被关了.但是最后关的是$i$还是$j$还是有差别的,所以还需要一维来标记. 因为需要区间和,所以再…
题目:https://www.luogu.org/problemnew/show/UVA10559 应该想到区间dp.但怎么设计状态? 因为连续的东西有分值,所以应该记录一下连续的有多少个. 只要记录与边界连续的有多少个就能涵盖所有的连续了.只记一边的边界即可. 两个转移:用掉记录的那些连续的 或 在自己区间中再找一个一样颜色的使连续数量+1. 用掉了以后剩余部分的连续长度就是0.也许 j-1 和 j 同色,但这个可以在另一个转移里体现,所以没问题. #include<iostream> #i…
题目:https://www.luogu.org/problemnew/show/P1018 区间DP+高精,注意初始化和转移的细节. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #define MAXN 20005 using namespace std; typedef long long ll; ll n,k,a[],f[][][MAXN],tmp[MAXN],num[MAXN]; ];…
题目:https://www.luogu.org/problemnew/show/P1220 区间DP. 代码如下: #include<iostream> #include<cstdio> using namespace std; int n,c,pos[55],w[55],sum,s[55][55],dp[55][55][3],INF=10000006; int main() { scanf("%d%d",&n,&c); for(int i=1…
因为昨天在Codeforces上设计的区间dp错了(错过了上紫的机会),觉得很难受.看看学长好像也有学,就不用看别的神犇的了. 区间dp处理环的时候可以把序列延长一倍. 下面是 $O(n^3)$ 的朴素区间dp: ; len<=n; len++) { //枚举长度 ; i+len<=n+; i++) { //枚举起点 ; for(int k = i; k<j; k++) { //枚举分割点,更新小区间最优解 dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+][…
前天测试考了QAQ.这么经典的区间dp不再开一文好像有点可惜. 内容是从模拟赛结题报告中copy来的.QAQ noip能量项链原题. https://www.luogu.org/problemnew/show/P1063 Chemist没有做过能在考场上1A,%一%!!! 加强了对区间dp的理解! 一般地,我们在求解区间型动态规划时,会把一个个区间作为各个阶段. 一般地,需要用到三层循环进行枚举,外层为区间长度,其次为端点,最内层为断点. 另外,本题还需要断环成链,开long long. cod…
题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][j][k] 表示右边有 k 个和 j 颜色相同的点时(其它都已经各自被消掉),消除 i ~ j 区间的答案: 从消除 j 点来考虑,有两种方法:1.和右边那 k 个点合并消除,所以 f[i][j][k] = f[i][j-1][0] + ( len[j] + k )2 2.和右边以及区间中的某个相同…
区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n天卖掉i..j货物的收益 dp[begin][end]=max(dp[begin][end-1]+value[end]*(n-len+1) ,dp[begin+1][end]+value[begin]*(n-len+1)); 注意理解 代码 递推形式 #include<bits/stdc++.h>…
P4677 山区建小学 题目描述 政府在某山区修建了一条道路,恰好穿越总共nn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di 为了提高山区的文化素质,政府又决定从n个村中选择m个村建小学. 请根据给定的n.m以及所有相邻村庄的距离,选择在哪些村庄建小学,才使得所有村到最近小学的距离总和最小,计算最小值. 题解:https://www.luogu.org/blog/hsfzLZH1/solution-p4677 区间dp主要是下面这几段…
https://www.luogu.org/problemnew/show/P1040#sub 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下: subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数. 若某个子树为空,规定其加分为1,叶…
题目链接 https://www.luogu.org/problemnew/show/P2858 一句话题意: https://cn.vjudge.net/problem/POJ-3186#author=Re0 分析 很显然这道题是不行滴,但是把这个数列看作从一个个区间倒着向外扩展取数而成的话,这样就保证了最优子结构和无后效性两个特点,于是就开始DP了 按照区间DP一贯的套路,先初始化元区间,也就是长度为1的区间值\(f[i][i]=a[i] * n\),为什么要倒着取呢?前面已经说明了,这样保…
题目链接 https://www.luogu.org/problemnew/show/P1005 分析 忽然发现这篇题解好像并没有什么意义...因为跟奶牛零食那道题一模一样,博主比较懒如果您想看题解的话去区间DP标签中找奶牛零食那道题吧,实在抱歉... 话说NOIP喜欢考奶牛题啊(e.g. NOIP2017 D1T1),USACO刷完是不是就能阿克了呀 代码没写高精用__int128代替,话说什么时候补个高精的坑(flag) 代码 #include <cstdio> #include <…
题目链接 https://www.luogu.org/problemnew/show/P4302 分析 很明显一道区间DP题,对于区间\([l,r]\)的字符串,如果它的字串是最优折叠的,那么它的最优结果要么是所有分割出的字串最优结果之和,要么是在断点处恰好有这个区间的周期串可以进行折叠,折叠后产生的结果 状态转移 for(ri len=2;len<=n;len++){//枚举长度,套路 for(l=1;l<=n-len+1;l++){ r=l+len-1; for(ri k=l;k<r…
题目链接:https://www.luogu.com.cn/problem/P1220 本题涉及算法:区间DP. 我们一开始要做一些初始化操作,令: \(p[i]\) 表示第i个路灯的位置: \(w[i]\) 表示第i个路灯的功率: \(sum[i]\) 表示前i个路灯的总功率 我们设状态 \(f[l][r][i]\) 表示: 当 \(i=0\) 时,老张关了编号 \([l,r]\) 范围内的所有灯,并且此时老张在第 \(l\) 盏灯处(最左边)的最少消耗电量: 当 \(i=1\) 时,老张关了…
题目链接:https://www.luogu.com.cn/problem/P1043 这道题与石子合并很类似,都是把一个环强制改成一个链,然后在链上做区间dp 要初始化出1~2n的前缀和,方便在O(1)的时间内查询[l,r]区间的和. f[l][r][h] -> 第一维:左端点:第二维:右端点:第三维:分成了几段. 动态转移方程: 很显然的一个初始化:f[l][r][1]=del(sum[r]-sum[l-1]); 转移:f[l][r][h]=min/max(f[l][r][h],f[l][k…
嗯... 题目链接:https://www.luogu.com.cn/problem/P1063 这道题首先要读懂题目,然后往上套区间dp,要转换成链式. AC代码: #include<cstdio> #include<iostream> using namespace std; ],f[][]; int main(){ int n; scanf("%d",&n); ;i<=n;i++){ scanf("%d",&a[i…
题目网址:https://www.luogu.com.cn/problem/P1063 题意大致是:给定一个序列An,第i个元组表示为(Ai,Ai+1),序列位置不变,当合并一个区间[l,l+1]时开销是Al*Al+1*Al+2,问合并整个序列的最大开销.一看就是区间dp,顺便借助记忆化减少搜索的冗余.题目中的项链是环状的,可以通过拼接相同的序列在元序列之后构造出一条链状的序列.这个问题与矩阵链相乘有点相似.代码如下: #include<bits/stdc++.h> using namespa…
(题面来自Luogu) 题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走到2*x的位置.计算他至少需要几步追上他的牛. 输入格式 第一行为一个整数t(≤10),表示数据组数:接下来每行包含一个两个正整数x和y(0<x,y≤10^5),分别表示FJ和牛的坐标. 输出格式 对于每组数据,输出最少步数. 这个数据范围下bfs能过实在是很玄--(你以为你的dp能胜过我的bfs…
写在前面连个引言都不加就直接开1. 区间DP状态常见模板: f[i][j]常常表示第i个到第j个这个区间内达到题目要求,所需要的最小值(最大值) 如: 1. [石子合并](https://www.luogu.com.cn/problem/P1880) 这里的f[i][j]表示将i-j堆石头合并所需要的最小/大体力 1. [关路灯](https://www.luogu.com.cn/problem/P1220) 这里的f[i][j][0/1]表示将i-j的区间的灯完全关闭,老人站在左/右端点时剩下…
记录一下第一道ac的区间dp 题目:P1880 [NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码: #include <iostream> using namespace std; typedef long long ll; int a[210], dpmax[210][210], dpmin[210][210], sum[210], ma = -1, mi = 1000000000; int main() { ios::sync_with_…
2021.07.17 P4170 染色(区间DP) [P4170 CQOI2007]涂色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.目标状态可以由哪些状态转移过来. 题目: 每次可以改变一段连续区间的颜色,问最少需要几次可以吧颜色改为目标区间颜色. 分析: 在一段连续区间(l,r)内,如果l,r处颜色相同,则选择(l+1,r)以及(l,r-1)这两个区间内修改次数少的,如果不同,枚举区间内断点,将两个小区间内次数相加. 代码如下: #include<bits/…