算法竞赛进阶指南刷题
HOGWARTS333
live and learn
展开
-
环路运输(单调队列+环形处理)
传送门此题是环状结构,处理的方式是把环断开,复制一倍接在末尾,形成长度为2n的链。#include<iostream>#include<queue>using namespace std;const int MAXN = 1e6+5;const int INF = 0x3f3f3f3f;int n;int value[MAXN*2];int monot...原创 2019-10-12 23:35:13 · 276 阅读 · 0 评论 -
P2014 选课(树形DP)
传送门树形DP入门题。这类题目被称为背包树形DP,又称有树形依赖的背包问题。虽说是入门题,但第一次写并不是很顺利,网上的解法都是二维的,但我只会先用高维做再转成低维的,搞的就很难受。三维解法,思路见注释#include<iostream>#include<cstdio>#include<vector>#define maxn 305using na...原创 2019-10-07 22:14:23 · 138 阅读 · 0 评论 -
CH 5302 金字塔(区间DP)
传送门设dp[l][r]为序列l至r代表的子树的个数,由DFS序的特性可以知道,如果要一棵完整的子树的DFS序两端的序号是一样的,都是树根的编号。这里状态方程的巧妙之处就在于,运用乘法原理,保证了状态不会有重复#include<iostream>#include<cstring>#include<algorithm>#include<string...原创 2019-10-04 16:07:48 · 144 阅读 · 0 评论 -
poj1179 Polygon(区间DP)
传送门这是一道环形DP,解决方法是“任意选择一个位置断开,复制形成2倍长度的链”。#include<iostream>#include<cstring>#include<vector>using namespace std;typedef long long ll;const ll INF = 1e18;int n;char opt[105]...原创 2019-10-02 23:15:39 · 163 阅读 · 1 评论 -
Mobile Service(线性DP)
传送门真是一道好题,最近写了不少DP,对状态的设计也大概有了个掌握,知道什么情况下可以设计什么样的状态。这道题虽然也看了一下蓝书上的题解,但跟自己独立想的还是差不多的。也是很难得没有看代码AC出来。。我们可以设F[i][x][y][z]表示完成了i个请求,三个员工分别位于x,y,z的位置时,公司的花费。但可以推出的是,完成i请求后,必定有一个员工的位置在request[i],因此这个位置就是一...原创 2019-09-23 19:46:13 · 260 阅读 · 0 评论 -
poj 3666 Making the Grade(线性DP)
传送门做这题需要进阶指南上提到的一个引理:在满足S最小化的前提下,一定存在一种构造序列B的方案,使得B中的数值都在A中出现过。证明略。我们可以从这个引理入手设计状态,设dp[i][j]表示将a[i]变为j需要的最小cost,且此时i之前的dp值都已经求好。将数组离散化并放入num数组。状态转移方程如下dp[i][j] = min(dp[i][j], dp[i-1][k]+abs(a[i]-n...原创 2019-09-22 21:53:06 · 157 阅读 · 0 评论 -
LCIS(最长公共上升子序列)
传送门题意:给你两串数列,让你求它俩的最长上升子序列思路:令f[i][j]表示以a[1-i], b[1-j]构成的以b[j]为结尾的最长上升子序列,不难推出状态转移方程if(a[i] != b[j]) f[i][j] = f[i-1][j]if(a[i] == b[j]) f[i][j] = max(dp[i][j], dp[i-1][k]), 其中k满足0<k<j,a[i...原创 2019-09-18 20:46:45 · 172 阅读 · 0 评论 -
poj 2279 Mr. Young's Picture Permutations(线性DP)
传送门#include<iostream>using namespace std;typedef long long ll;ll k; //k rowll n[10]; // number of each rowll dp[31][31][31][31][31];int main(){ ios::sync_with_stdio(0); cin.tie(...原创 2019-09-18 15:22:39 · 141 阅读 · 0 评论 -
poj3614 Sunscreen(贪心)
题意:有C头奶牛,L种防晒霜,每头奶牛可以抹的防晒霜为有个范围,为minSPF和maxSPF,每种防晒霜有对应的SPF,问最多可以让多少头奶牛抹上防晒霜。思路:贪心的策略 :按照minSPF递减顺序遍历奶牛,对于每头奶牛,遍历所有的防晒霜。在这头奶牛可用的防嗮霜里面取最大的证明:对于当前奶牛可用的任意两瓶防嗮霜x和y,如果SPF[x]<SPF[y],那么后面其他奶牛只可能出现“x,y 都...原创 2019-09-13 19:58:39 · 191 阅读 · 0 评论 -
poj2182 Lost Cows(线段树 | 树状数组)
题目链接题意:给一个序列,序列里面每个值的的含义是该位置奶牛前面比它高的奶牛数,求该奶牛的身高。思路:①线段树:可以看到1在的位置一定的数一定是0,而选出1后,2就是最小的了。用线段树维护这个序列,每次查询出区间最小数的位置。#include<iostream>#include<cstring>#include<cstdio>#include<...原创 2019-09-11 17:38:34 · 174 阅读 · 0 评论 -
扑克牌(概率dp)
题目链接#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int A, B, C, D;double f[20][20][20][20][5][5];bool vis[20][20][20][20][5][5];...原创 2019-09-10 17:14:39 · 408 阅读 · 0 评论 -
Poj1456 Supermarket(贪心)
题目链接:http://poj.org/problem?id=1456题意:给定N个商品,每个商品有利润pi和过期时间di,每天只能卖一个商品,过期商品不能再卖,求如何安排每天卖的商品,可以使收益最大解法一:优先队列+贪心在最优解中,对于每个时间(天数)t,应该在保证不卖出过期商品的前提之下,尽量卖出利润前t大的商品。我们把商品按照过期时间排序,建立一个初始为空的小根堆,存储商品利润,然后扫...原创 2019-08-30 11:07:40 · 165 阅读 · 0 评论 -
可达性统计(拓扑排序+状态压缩)
题意:给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量思路:该题的暴力做法就是从每个点开始dfs,就能得到每个点最多可到达的点的数量,但很明显会超时。先对图进行拓扑排序,这样可以由拓扑序由后向前递推。一种很妙的做法是使用bitset进行状态压缩,用一个3000位的二进制数来表示一个点的状态,对于第i个点,考虑与其直接相连的边,如果j与其相连,则该二进制的第j位为1。可以看...原创 2019-09-09 16:05:13 · 240 阅读 · 1 评论