dp(x, p) 表示序列中第x个数, 上一个数是p构成的等差数列的最长. 转移时从[1, x)中枚举p = seq[] 就行了.时间复杂度O(n²logn) --------------------------------------------------------------------------------- #include<bits/stdc++.h>     #define rep(i, n) for(int i = 0; i < n; i++) #define Rep…
3357: [Usaco2004]等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 338  Solved: 160[Submit][Status][Discuss] Description     约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:“1,4,3,5,7” 很容易看出“1,3,5,7”是等差数列.     给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度. Inpu…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3357 题意: 给你n个数a[i],让你找出一个最长的是等差数列的子序列. 题解: 表示状态: dp[i][a[j]] = max len 表示当前选了a[i],上一个数是a[j]时,最长的等差数列长度. 找出答案: max dp[i][a[j]] 如何转移: map<int,int> dp[MAX_N]; dp[i][a[j]] = max dp[a[j]][2*a[j] - a[i]…
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #define maxn 2003 using namespace std; map<int,int>k; int arr[maxn],f[maxn][maxn]; int main() { // setIO("input"); int n,ans=0; scanf("…
3357: [Usaco2004]等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 321  Solved: 153[Submit][Status][Discuss] Description     约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:“1,4,3,5,7” 很容易看出“1,3,5,7”是等差数列.     给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度. Inpu…
题目链接:http://codeforces.com/problemset/problem/977/F 题意: 给定一个长度为 $n$ 的整数序列 $a[1 \sim n]$,要求你找到一个它最长的一个子序列,该子序列满足单调连续递增. 子序列可以不连续,单调连续递增即例如 $[4,5,6,7]$ 或者 $[6,7,8,9,10]$ 这样的. 题解: $f[i]$ 表示以 $a[i]$ 为结尾的最长连续递增子序列,那么要转移就需要找到 $[1,i-1]$ 这个区间内,某个满足 $a[j] = a…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 课上讲的题,还是参考了博客...:https://www.cnblogs.com/GXZlegend/p/8615607.html 这道题和之前写的斜率优化不同的一点是用单调栈维护上凸壳,而且需要二分查找答案: 为什么感觉每次写出来的斜率优化DP都不一样...还是没有理解透彻... 代码如下: #include<iostream> #include<cstdio> #i…
这个题目中 斜率优化DP相当于存在一个 y = kx + z 然后给定 n 个对点 (x,y)  然后给你一个k, 要求你维护出这个z最小是多少. 那么对于给定的点来说 我们可以维护出一个下凸壳,因为如果存在一个上突壳的话,那么上突壳的点是一定不会被选上的. 所以对于解来说,只有下凸壳的点再会被选到. 所以我们就可以用单调队列维护处这个下凸壳. 假如我们保证给定的k是单调递增的, 那么我们就可以把前面一段不需要的东西给删掉. 假如k不是单调的,则我们就可以用二分找到第一个 >  询问k的答案.…
如果有一块土地的长和宽都小于另一块土地的长和宽,显然这块土地属于“赠送土地”. 我们可以排序一下将这些赠送土地全部忽略掉,一定不会影响到答案. 那么剩下的土地就是长递减,宽递增的.令dp[i]表示购买前i个土地的最小代价. 显然有dp[i]=min(dp[j]+ku[i]*ch[j+1]).(j<i). 其中ku[i]表示第i个土地的宽,ch[i]表示第i个土地的长. 这个式子得用斜率优化一下.很normal,推出式子就解决了. # include <cstdio> # include…
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首先选择一个长度超过1的序列(一开始小H只有一个长度为n的序列--也就是一开始得到的整个序列): 2.选择一个位置,并通过这个位置将这个序列分割成连续的两个非空的新序列.   每次进行上述步骤之后,小H将会得到一定的分数.这个分数为两个新序列中元素和的乘积.小H希望选择一种最佳的分割方式,使得k轮之后…
4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[i]-s[k])^2 \}\) 发现可以斜率优化,很久没写忘记了60分暴力走人 拆开平方,\(f[i][p]=-2s_i s_k + f[k][p-1] + s_k^2 - s_i^2\) 对于两个转移\(j,k\),j比k优时\[ slope(j,k)=\frac{f[j]+s_j^2-f[k]-…
You are given an integer array of length nn. You have to choose some subsequence of this array of maximum length such that this subsequence forms a increasing sequence of consecutive integers. In other words the required sequence should be equal to […
dp[i]=min(dp[j]+(sum[i]-sum[j]+i-j-1-L)^2) (j<i) 令f[i]=sum[i]+i,c=1+l 则dp[i]=min(dp[j]+(f[i]-f[j]-c)^2) 1.证明决策单调性 假设在状态i处的k决策优与j决策,即 dp[k]+(f[i]-f[k]-c)^2<=dp[j]+(f[i]-f[j]-c)^2 则对于i后的所有状态t,要证明决策单调性 即dp[k]+(f[t]-f[k]-c)^2<=dp[j]+(f[t]-f[j]-c)^2 只…
题意 给$n$个贝壳,可以将贝壳分成若干段,每段选取一个贝壳$s_i$,这一段$s_i$的数目为$num$,可以得到$num^2\times s_i$个柠檬,求最多能得到几个柠檬 可以发现只有在一段中首尾颜色相同的情况下最优,所以每次选取一段里末位的$s_i$变成柠檬,于是有$f_i=max_{j \le i}{f_{j-1}+s_i\times(pre_i-pre_j+1)^2}$ ,$pre_i$表示前$i$个贝壳里$s_i$出现了几次 令$j<k$,假设$f_{j-1}+s_i\times…
题面 BZOJ传送门(中文题面但是权限题) HDU传送门(英文题面) 分析 定义f[i]f[i]f[i]表示在iii时间(离散化之后)卖出手上的机器的最大收益.转移方程式比较好写f[i]=max{f[j]−p[j]+r[j]+(d[i]−d[j]−1)∗g[j]}f[i]=max\{f[j]-p[j]+r[j]+(d[i]-d[j]-1)*g[j]\}f[i]=max{f[j]−p[j]+r[j]+(d[i]−d[j]−1)∗g[j]} 显然可以斜率优化,移项之后得到(f[j]−p[j]+r[j…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2436 题意:有一些活动,起始时间持续时间已知.有两个场地.每个活动最多只能在一个场地举行,且两个场地同一时间不能都举行活动.但是同一场地同一时间可以举行多个活动.要求的是两个场地中活动数目少的场地的活动数目的最大值S.再输出某个活动必须被安排时的S值. 思路:我直接粘贴原思路了. 区间离散化,设A={嘉年华1的活动}, B={嘉年华2的活动},C={未安排的活动}. 设num[i][j…
B. Fox And Jumping time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is playing a game. In this game there is an infinite long tape with cells indexed by integers (positive, negativ…
The time of a day Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 1297    Accepted Submission(s): 594 Problem Description There are no days and nights on byte island, so the residents here can h…
就是套路咯,设s[i]为1+2+...i 首先列出dp方程\( f[i]=min(f[j]+a[i]+(i-j)*i-(s[i]-s[j])) \) 然后推一推 \[ f[i]=f[j]+a[i]+(i-j)*i-(s[i]-s[j]) \] \[ f[i]=f[j]+a[i]+i*i-i*j-s[i]+s[j] \] \[ i*j+f[i]=f[j]+s[j]+i*i+a[i]-s[i] \] \[ k=i,b=f[i],y=f[j]+s[j]+i*i+a[i]-s[i] \] 就没啦 #in…
传送门 题目分析: \(f[i][j]\)表示第i天,手中拥有j份股票的最优利润. 如果不买也不卖,那么\[f[i][j] = f[i-1][j]\] 如果买入,那么\[f[i][j] = max\{f[i - w - 1][k] - A_p*(j - k)\} (j - as + 1 \le k \le j)\]由于是从小的更新大的,所以顺序 如果卖出,那么\[f[i][j] = max\{f[i - w - 1][k] + B_p*(k - j)\} (j \le k \le j + bs…
建立矩阵,跑快速幂 /************************************************************** Problem: 4000 User: idy002 Language: C++ Result: Accepted Time:32 ms Memory:836 kb ****************************************************************/ #include <cstdio> #include…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1096 设 f[i] 为 i 作为最后一个仓库时前 i 个工厂的答案,最后的答案当然是 f[n]: f[i] = min{ f[j] + ∑(j+1<=k<=i)p[k]*(x[i]-x[k]) + c[i] } , 1<=j<i 令 s[i] = ∑(1<=j<=i)p[j],t[i] = ∑(1<=j<=i)p[j]*x[j] 则 f[i] = mi…
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<…
http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题意: 思路: 容易得到朴素的递归方程:$dp(i)=min(dp(i),dp(k)+(i-k-1+sum[i]-sum[k]-l)^{2})$,$sum[i]$表示前i个玩具的$c_{i}$之和.$f(k)$表示前k个玩具的最小费用. 如果设$f(i)=sum[i]+i$,那么上式就可以改写为$dp(i)=min(dp(i),dp(k)+(f(i)-f(k)-l-1)^{2})$. 所以这…
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜,但不同时刻倾斜方向可能不同:具体来说,当时间处于区间\([l_i, r_i]\)内时,向\(d_i\)方向倾斜(输入保证给出的所有区间是连续的). 海上钢琴师1900的钢琴在这块地面上滑动,每时每刻,可以选择让钢琴向着地面倾斜的方向滑动一格,或是待在原地不动.当然,钢琴不能滑到障碍上,也不能滑出矩…
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器…
3156: 防御准备 Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT 1<=N<=10^6,1<=Ai<=10^9 题解: 斜率优化DP: 首先将数组倒置 设定dp[i] 为前i的点的最优答案 易得 dp[i] = min{dp…
我的第一道需要程序建矩阵的矩阵优化DP. 题目可以将不同的p分开处理. 对于p==0 || p==1 直接是0或1 对于p>1,就要DP了.这里以p==3为例: 设dp[i][s1][s2][r]为前i列,结尾为0的有s1行(0表示女生,1表示男生),结尾为01的有s2个,结尾为011的有n-s1-s2个,有r列全是1的方案数. 状态这么复杂,看起来一点也不能用矩阵优化,但我们可以将状态(s1,s2,r)hash成整数,然后建立状态之间的转移. 收获: 这种m超过10^7的一般都要用矩阵优化,如…
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 思路 [斜率优化DP] 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i]的形式,其中f[j]中保存了只与j相关的量.这样的DP方程我们可以用单调队列进行优化,从而使得O(n^2)的复杂度降到O(n). 可是并不是所有的方程都可以转化成上面的形式,比如dp[i]=dp[j]+(x[i]-x[j])*(x[i]-x[j]).如果把右边的乘法化开的话,会得到x[i]*x[j…
题目 传送门:QWQ 分析 用$ dp[i] $ 表示前 i 个人组成的战斗力之和 然后显然$ dp[i]=Max (  dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c ) $ 然后就是斜率优化dp的套路,设个k比j优........... 然后对最后得出的式子搞斜率优化(太长了懒得写) 代码 #include <bits/stdc++.h> using namespace std; ; typedef long long ll; ll dp[max…