12 2020 档案

摘要:注意是要求最大化高度(运输量),而不是最小化路径长度。 于是二分高度,判断只走高度不超过mid的边的情况下,到达终点的最短距离。若不能抵达终点则返回false。 最后输出答案时要先check()出最优解再输出。 const int N=1010; struct Node { int v,h,c; 阅读全文
posted @ 2020-12-20 17:20 Dazzling! 阅读(58) 评论(0) 推荐(0) 编辑
摘要:LCS简单变形 状态表示:f(i)1i中最长上升子序列的和值。 状态转移: f(i)=\begin a[1],i = 1\max(f(k)+a[i]),1≤k<i && a[i]>a[k] \end const int N=1010; int f[N]; int a[N]; 阅读全文
posted @ 2020-12-19 20:53 Dazzling! 阅读(45) 评论(0) 推荐(0) 编辑
摘要:水题~ const int N=25; char g[N][N]; bool vis[N][N]; int n,m; PII st; bool check(int x,int y) { return x>=0 && x<n && y>=0 && y<m; } int bfs() { queue<PI 阅读全文
posted @ 2020-12-19 20:32 Dazzling! 阅读(42) 评论(0) 推荐(0) 编辑
摘要:由于边权有12两种情况,所以就不能用裸的BFS了,改成优先队列BFS(其实就是dijkstra)。 const int N=210; struct Node { int dis; int x,y; bool operator>(const Node &W) const { re 阅读全文
posted @ 2020-12-19 15:05 Dazzling! 阅读(45) 评论(0) 推荐(0) 编辑
摘要:floodfill裸题 DFS const int N=110; char g[N][N]; bool vis[N][N]; int n,m; bool check(int x,int y) { return x>=0 && x<n && y>=0 && y<m; } void dfs 阅读全文
posted @ 2020-12-18 22:50 Dazzling! 阅读(39) 评论(0) 推荐(0) 编辑
摘要:简单回溯法 注意:回溯法搜索全空间可不清vis数组 const int N=25; int a[N]; bool vis[N]; int n; bool isprime(int x) { for(int i=2;i*i<=x;i++) if(x % i == 0) return false; ret 阅读全文
posted @ 2020-12-18 22:35 Dazzling! 阅读(43) 评论(0) 推荐(0) 编辑
摘要:读题BFS裸题,信心满满交了一发\color const int N=10; char g[N][N]; int dist[N][N]; int n,m,tim; PII st,ed; bool check(int x,int y) { return x>=0 && x<n && 阅读全文
posted @ 2020-12-17 12:43 Dazzling! 阅读(33) 评论(0) 推荐(0) 编辑
摘要:水题~ int cmp(double a,double b) { if(fabs(a-b) < eps) return 0; return a>b?1:-1; } int main() { double x; while(~scanf("%lf",&x)) { if(!cmp(x,0)) break 阅读全文
posted @ 2020-12-17 10:53 Dazzling! 阅读(82) 评论(0) 推荐(0) 编辑
摘要:一般情况下,动态规划的解题步骤是: 第一步:根据原问题和子问题来确定状态(我的dp数组要表示什么东西) 第二步:根据状态确定状态转移方程(递推式,怎样求解dp数组) 第三步:确定要不要优化和编程实现方式 (其实可以这样理解——第一步是确定“我是谁,我在哪”,第二步是确定“我从哪里来”或者“我到哪里去 阅读全文
posted @ 2020-12-16 16:13 Dazzling! 阅读(169) 评论(0) 推荐(0) 编辑
摘要:状态表示:f(i,j):从下标i合并到下标j的最大价值。 先看石子合并(n堆石子): 1,2,...,n f(1,n)即为答案。 再看环形: 最后的答案为:f(1,n)(f(n,1)f(1,n))f(2,1)f(3,2)...中的最小值。 我们当 阅读全文
posted @ 2020-12-16 10:08 Dazzling! 阅读(110) 评论(0) 推荐(0) 编辑
摘要:01背包裸题 const int N=110,M=1010; int f[M]; int n,m; int main() { cin>>m>>n; for(int i=1;i<=n;i++) { int v,w; cin>>v>>w; for(int j=m;j>=v;j--) f[j]=ma 阅读全文
posted @ 2020-12-15 21:13 Dazzling! 阅读(113) 评论(0) 推荐(0) 编辑
摘要:LIS简单变形。 状态表示: l[i]1i的最长上升子序列长度 r[i]in的最长下降子序列长度 注意最后是输出出列的人数=_=。 const int N=110; int a[N]; int l[N],r[N]; int n; int main() { cin> 阅读全文
posted @ 2020-12-15 21:03 Dazzling! 阅读(108) 评论(0) 推荐(0) 编辑
摘要:经典的区间DP问题。 区间DP特征:从小区间逐渐向大区间扩展递推。 题解 贪心只能处理“任取两堆”,而不能处理“相邻两堆”。任取两堆的题目就是合并果子。 状态表示:f(i,j):合并区间[i,j]的最小代价 状态转移:$f(i,j) = \begin0,i = j\ \under 阅读全文
posted @ 2020-12-15 20:38 Dazzling! 阅读(85) 评论(0) 推荐(0) 编辑
摘要:经典哈夫曼树的模型,每次合并重量最小的两堆果子即可。 const int N=10010; int a[N]; int n; int main() { cin>>n; priority_queue<int,vector<int>,greater<int> > heap; for(int i=1;i< 阅读全文
posted @ 2020-12-15 20:14 Dazzling! 阅读(79) 评论(0) 推荐(0) 编辑
摘要:新名词get:序列自动机 思路挺好想的,一共n个位置,对每个位置建立26个指针,指向后面第一次出现对应字母的位置。倒序处理一遍即可。 注意: 不存在对应字母的话位置记为0 下标0也要初始化 子序列进行匹配时从下标0开始匹配,下标0存放的指针代表1n中第一次出现对应字 阅读全文
posted @ 2020-12-15 17:32 Dazzling! 阅读(151) 评论(0) 推荐(0) 编辑
摘要:题意 给定一个字符串 S,求出 S 中所有的既是前缀又是后缀的子串。 题解 求出 next 数组,答案就是 len, next[len], next[next[len]],...直到为0为止。 const int N=4e5+10; char s[N]; int ne[N]; int n; void 阅读全文
posted @ 2020-12-14 15:32 Dazzling! 阅读(98) 评论(0) 推荐(0) 编辑
摘要:题意 给你一个字符串,让这个字符串变成一个至少有两个循环节的字符串,问至少添加几个字符,添加字符只能在头部和尾部添加不能在中间添加(这是个环)。 裸KMP求最小循环节。 const int N=1e5+10; char s[N]; int ne[N]; int n; void init() { fo 阅读全文
posted @ 2020-12-14 13:22 Dazzling! 阅读(41) 评论(0) 推荐(0) 编辑
摘要:spfa判负环裸题 const int N=510; vector<PII> g[N]; int dist[N]; bool vis[N]; int cnt[N]; int n,m,w; bool spfa() { memset(dist,0x3f,sizeof dist); memset(cn 阅读全文
posted @ 2020-12-13 20:45 Dazzling! 阅读(100) 评论(0) 推荐(0) 编辑
摘要:KMP简单变形,不能重复用字段,所以要进行一点小修改。 很自然的想到,原本在文本串中找到了模式串之后,单纯ans++,下一次循环必然是j=Next[j],就是j回溯到Next[j]位置;那么,这个时候就相当于用了一些重复字段(Next[j]位置前的那些字符,都是被重复使用了),那么显然,在ans++ 阅读全文
posted @ 2020-12-13 18:30 Dazzling! 阅读(74) 评论(0) 推荐(0) 编辑
摘要:01背包解法 适用数据范围:N40M106 状态表示:f(i,j):从前i个物品中选,花费不超过(小于等于)j的方案数。 最后累加f(n,0m)即可。 const int N=45,M=1e6+10; LL price[N]; LL f[M]; LL n, 阅读全文
posted @ 2020-12-13 15:18 Dazzling! 阅读(91) 评论(0) 推荐(0) 编辑
摘要:折半搜索,O(n)型枚举,二分查找相反数个数,时间复杂度(O(n2logn)) const int N=4010; int a[N],b[N],c[N],d[N]; int ab[N*N]; int n; int main() { cin>>n; for(int i=0;i<n;i++ 阅读全文
posted @ 2020-12-13 11:15 Dazzling! 阅读(64) 评论(0) 推荐(0) 编辑
摘要:由于可以在任意时刻发送数据包,对于1到n的所有路径,尽管所用时间不同,可你完全可以通过调整他们的开始时间,使他们最后在同一时间到达。 故题目转换为求1~n的路径数目。规定了图为DAG,拓扑排序即可。 const int N=1e5+10; vector<PII> g[N]; int din[ 阅读全文
posted @ 2020-12-03 18:30 Dazzling! 阅读(84) 评论(0) 推荐(0) 编辑
摘要:分层图最短路,注意按照题意中的“穿过”的定义来模拟。 const int N=1e5+10; struct Node { int dis; int u,cnt; bool operator>(const Node &W) const { return dis>W.dis; } }; vector<P 阅读全文
posted @ 2020-12-02 23:25 Dazzling! 阅读(98) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示