Photo bzoj-3126 题目大意:给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问最多能有多少个点. 注释:$1\le n \le 2\cdot 10^5$,$1\le m\le10^5$. 想法:开始和GXZlegend在那里贪心.贪了挺久发现几乎所有的贪心策略都会被卡,此题被当做毒瘤题.然后上bz上找题解发现了新大陆?? 这题是一个dp. 状态:dp[i]表示第i个位置必须放点,最多能在前i个位置放多少点. 转移:我们记录几个事儿.首先,R[i]表示所有区间中包含i且左端…
股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最大获利. 转移:第i天可以选择搞事情或者什么都不干. 如果不买不卖的话,有dp[i][j]=dp[i-1][j] 如果选择买入,dp[i][j]=dp[i-w-1][k]-ap[i](j-k)|k>=j-as[i] 如果选择卖出,dp[i][j]=dp[i-w-1][k]+bp[i](k-j)|k<…
理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a,b,n\le 10^3$,$n\le min(a,b)$. 想法:我的思路简直要死.通常的,我们优化暴力来完成对题目的求解.首先,想暴力.漂亮的暴力没想到,倒是想到一个a*b*n*n的,就是枚举每一个点,如果这个点可以作为n*n正方形的左上角,我就暴力枚举这个正方形的所有点.时间复杂度:O((a-n…
Code: #include<cstdio> #include<cstring> #include<deque> #include<algorithm> using namespace std; const int N = 200 + 3; char map[N][N]; int n, m, k, dp[N][N], fin; struct Node{ int x, y, val; Node(int x = 0, int y = 0,int val = 0)…
bzoj4368 IOI2015 boxes纪念品盒 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4368 数据范围:略. 题解: 如果在一个最优方案中,一个点$i$是这个人拿东西从左侧走过来的,我们就说这个点是蓝的. 如果是右侧的,就说这个点是红. 我们发现,并不存在三个可以不连续的点,满足红蓝红. 即,一定存在一个点$i$,满足$1\sim i$的点是蓝的,$i + 1\sim n$是红的. 接着我们维护一个$dp$状态:$f_i$,表…
[BZOJ2442]修建草坪(动态规划,单调队列) 题面 权限题..洛谷 题解 设\(f[i]\)表示前\(i\)个里面选出来的最大值 转移应该比较显然 枚举一个断点的位置,转移一下就好 \(f[i]=max(f[j-1]+s[j]-s[i])\) 所以可以单调队列优化一下 (不优化用各种玄学可以拿90分...) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #…
[BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最大获利 每次枚举可以转移过来的天数以及股票数 再枚举买入或者卖出的数量, 时间复杂度\(O(T^2Mp^2)\),30pts(但是有40pts...) #include<iostream> #include<cstdio> #include<cstdlib> #includ…
BZOJ_1342_[Baltic2007]Sound静音问题_单调队列 题意: 给出n个数,求∑[ max{a[i]~a[i+m-1]} - min{a[i]~a[i+m-1]} <= c ] 分析: 滑动窗口 我们维护两个单调队列,分别存最大,最小值 代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorit…
BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP 题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f[i] = f[j] + s[i]-s[j+1] (i-j-1<=k 1<=j<i) 意思是我们j+1不要,要j+2到i这部分 发现可以用单调队列优化一下 维护一个单调递减的单调队列,比较时用f[i]-s[i-1]比较 代码: #include <stdio.h> #includ…
[CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素可以被分组. 题解 设\(f[i][j]\)表示把前\(i\)个数分成\(j\)组的最多人数. 然后单调队列转移一下完了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring&g…