自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 POJ1236 图论 tarjan SCC

题意: 给定一个有向图,求: 1) 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 2) 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点 思路: 1、求出所有强连通分量; 2、每个强连通分量缩成一点,则形成一个有向无环图DAG; 3、DAG上面有多少个入度为0的顶点,问题1的答案就是多少; 4、假定有 n 个入度为0的点,m个出度为0的点,max(m

2018-05-04 17:26:25 192

原创 动态规划 FZU2236 树状数组优化

题意: 这题是求一个数列中严格递增子序列的个数。比如数列(1,3,2)的严格递增子序列有(1)、(3)、(2)、(1,3)、(1,2),共5个。长得一样的但是位置不同的算不同的子序列,比如数列(3,3)的答案是2。 思路: 1、类LIS问题: dp[i] = sigmadp[j] + 1(j < i && a[j] < a[i]) 2、离散化 + 树状数组 反思: 代码:#include

2018-05-03 23:37:12 233

原创 CF961E 数据结构 树状数组

题意: 给定一序列a1,…,an, 求(i,j)的对数,使得a[i]>=j, 且a[j]>=i(i < j)。 思路: 大致思路:i从1到n遍历,对于每个i,需要找出有多少个j符合上述的条件。用树状数组维护每个i的选取状态(0或1)。 对于每一个i, ①对于a[i]>=j,我们可以用getSum(a[i]),得到符合条件的j的个数; ②对于a[j]>=i,我们可以先按a[i]的值从小到大

2018-05-03 17:46:53 359

原创 HDU5418 动态规划 状压DP

题意: 可多次拜访的类TSP问题。 思路: 状态转移方程:dp[s][v]=min(dp[s|{u}][u]+mp[u][v]) (u不属于s) 反思: 一个月没写代码,手都生疏了。五月份要加油!!! 代码:#include <cstdio>#include <vector>#include <cmath>#include <cstring>#include <iostream

2018-05-01 20:31:16 287

原创 POJ2186 图论 Tarjan求SCC

题意: 给定一个有向图,求有多少个顶点是由任何一个顶点出发都可达的。 思路: 定理:DAG中唯一出度为0的点,一定可以由任何点出发均可达(由于无环,所以从任何点出发往前走,必然终止于一个出度为0的点)。 另外,答案为0的情况有两种:一为底图不连通,二为有不止一个出度有0的缩点。大致流程: 1、DFS一遍查底图是否连通; 2、Tarjan算法求所有SCC并缩点; 3、再DFS一遍新图(缩

2018-03-28 12:49:47 224

原创 POJ2184 动态规划 01背包

题意: 某物 i , 有两种属性值 s[i] 和 f[i] ,每件物品可取或不取,求最后S + F的最大值,同时保证S >= 0 且 F >= 0。(S 为取出的 s[i] 的总和, F为取出的 f[i] 的总和) 思路: 1、涉及到取与不取的问题,很自然地想到了背包。 “物品的价值”这个显而易见,但是“背包的容量”在哪里?我们可以把两个维度 T 和 S,任取一个当作“物品的价值”,另一个做

2018-03-26 01:55:30 223

原创 POJ2392 动态规划 多重背包

题意:多重背包。略有区别的是,背包容量是每种砖块的Ai,价值和费用都是Hi。 思路: 多重背包转化为01背包和完全背包。 反思: 迫使自己学习了二进制优化,挺好的。 代码:#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int MAXN

2018-03-25 22:14:37 241

原创 POJ3666&CF714E 动态规划

题意: 给定a序列,构造非严格递增或非严格递减的b序列,使得| a[0] - b[0] | + | a[1] - b[1] | + … + | a[n-1] - b[n-1] | 最小,并求出其值。 思路: 最开始的思路是这样的: 假设构造的序列是非严格单调增的。 dp[i][j]:b序列的前i+1个数已成单调序列且最后一个元素为j时的最小成本。 转移方程:dp[i][j] = min

2018-03-17 17:06:50 207

原创 POJ1631 动态规划 LIS

题意: 求LIS。 思路: 反思: 1、学习了求LIS的O(nlogn)算法思想; 2、注释掉的部分为求LIS路径的代码。 代码:#include <cstdio>#include <algorithm>#include <cmath>#include <iostream>#include <stack>using namespace std;const int MAXN =

2018-03-17 01:12:29 198

原创 POJ1065 动态规划 LIS

题意: 求偏序集链的最小划分数。 思路: 1、贪心; 2、利用Dilworth定理转化成LIS模型。 反思: Dilworth定理:偏序集中链的最小划分数 = 最长反链长度。 代码: 1、贪心#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 5

2018-03-16 00:35:21 204

原创 POJ3181 动态规划 完全背包

题意: 给定1…k元面额的硬币,每种无限个,问能刚好凑成n元的方式数。 思路: 完全背包 + 前缀和优化 反思 : get到简易版大数加法。 代码:#include <cstdio>#include <cstring>#include <iostream>using namespace std;long long dp[100 + 10][1000 + 10][2];int ma

2018-03-11 00:30:14 200

原创 POJ3046 动态规划 多重集组合数

题意: 蚂蚁牙黑,蚂蚁牙红:有A只蚂蚁,来自T个家族。同一个家族的蚂蚁长得一样,但是不同家族的蚂蚁牙齿颜色不同。任取n只蚂蚁(S<=n<=B),求能组成几种集合?思路: 1、《挑战》P69 前缀和优化; 2、滚动数组优化。 反思: 初始化以及循环上下界的细节要考虑清楚。 代码:#include <cstdio>#include <iostream>#include <cstrin

2018-03-10 22:06:25 199

原创 POJ1742 动态规划 多重背包

题意: 问多重部分和能否恰好等于m。 思路: dp[i][j]:用前i种面额硬币凑成j后,第i种硬币最多剩下的个数,若凑不成则为-1.可优化空间复杂度。 反思: 想不出应该如此定义dp数组。 代码:#include <cstdio>using namespace std;int a[100 + 10];int c[100 + 10];int dp[100000 + 10];int m

2018-03-10 16:39:34 155

原创 CF917A 思维题

题意: codeforces 917A Monster 思路:First, let's denote s[l..r] as the substring slsl + 1... sr of string s. Also s.count(t) is the number of occurrences of t in s.A string consisting of parentheses and q

2018-01-31 00:25:29 377

原创 CF917B 动态规划 记忆化搜索

题意: Max和Lucas两人在DAG(边上有权重,为字符ASCⅡ码)顶点上进行博弈游戏。Max先行,且每人此轮走的边的权值需不小于对手上一轮走的边的权值,若某人无路可走,则输掉游戏。求Max和Lucas两人在任意起点的博弈结果。 思路: dp[i][j][c]:当Max位于i,Lucas位于j,且此前的最大权值为c,当Max移动时,Max的输赢情况(1为胜,0为负)。 如果存在k,#inc

2018-01-30 21:50:23 423

原创 待写

线段树 区间合并CDOJ844 POJ3667HDU3308HDU1540

2018-01-28 22:50:06 198

原创 POJ1011 DFS+剪枝

题意 乔治有一堆相同长度的木棍,随意切割。这时他想要将这些切割后的短棍复原成若干条相同长度的木棍。求复原后木棍的最小长度。 思路: 1、答案只可能是木棍总长的约数,且不小于最长短棍的长度,则可将问题转化为熟悉的求和问题。 2、将长度降序排列,有利于剪枝。 3、具体剪枝看代码注释。 反思 1、没有想到第一点。 2、剪枝还需强化。 代码#include <cstdio>#includ

2017-09-03 19:13:51 350

原创 POJ2676 DFS

题意: 解决数独问题 思路: DFS + 剪枝(构造数组) 反思: 1、没有想到运用构造数组的方法来剪枝; 2、没有掌握回溯法,即当解空间子树都无法解决问题时,根节点要清零。 实现:#include <iostream>#include <cstring>#define clr(x) memset(x, 0, sizeof(x))using namespace std;int

2017-08-28 16:15:34 249

原创 CF25E 字符串哈希/KMP

题意: 给定三个串,求包含这三个串的总串的最小长度。 思路: 字符串哈希。 当然,也可以用KMP,然而我自己没有想到,看来对KMP的理解仍然不够深。 这里也引用一下其他博主的KMP做法。 http://blog.youkuaiyun.com/u011345136/article/details/38400395 实现:#include <bits/stdc++.h>using namespace

2017-08-27 14:26:03 678

原创 HDU6143 组合数学 递推

题意:每个名字有名和姓两部分,两部分长度都是n,给定m种字符,且名和姓中不能有同一种字符,问有几种可能性? 思路: 如果n个长度用x个字符表达,那就相当于n个不同小球放在x个不同的盒子里。设其结果为f(x),那么f(x) = x ^ n - C(x, 1) * f(x - 1) - C(x, 2) * f(x - 2) …… - C(x, x - 1) * f(1). 然后就枚举两边各

2017-08-18 10:36:47 220

原创 HDU3294 manacher

题意:将字符串按一定规则变换,输出变换后的字符串中的最长回文串的起始和终止位置,并输出回文串。 题意:manacher模板题#include <iostream>#include <cstring>using namespace std;const int MAXN = 200000 + 10;char c, s[MAXN * 2];int p[MAXN * 2];int st, t,

2017-08-15 21:14:43 178

原创 POJ2001 字典树

题意:给定字符串集合,求每个串最短的能区别于其他字符串的前缀,如“carbohydrate”能缩短成“carboh”,但不能缩短成“carbo“,因为集合中有别的串也有相同前缀。 思路:模板题 反思:套用模板要小心,情况不同时某些细节也要因此调整,万不可大意。#include <iostream>#include <cstring>#include <cstdio>using namesp

2017-08-14 21:07:29 150

原创 HDU1671 字典树

题意:问给定字符串集合中是否存在某个字符串是另一个字符串的前缀情况。 思路:模板题 反思:一定要看清楚输出的格式、大写小写!#include <iostream>#include <cstring>using namespace std;const int MAXN = 10;struct Trie{ int v; Trie* next[MAXN];};Trie*

2017-08-14 19:34:51 154

原创 POJ2991 线段树 区间更新 计算几何

题意:吊车由n条不同长度的线段组成,每条线段首尾相接。初始状态:每条线段垂直与x轴。每次操作改变第s条和(s+1)条的逆时针角度为a,询问每次操作后第n段末尾的坐标。 思路: 1、将每段线段都视为向量,则每次询问的结果实质上是向量和。 2、每次改变第s段和第(s+1)段的相对角度,实际上是改变了从第(s+1)段至第n段的绝对角度,则可以通过线段树进行区间更新。然而,题目给定的是第s段和第(s+

2017-08-14 15:33:38 255

原创 HDU1257 贪心

题意:求一数列中最少有多少个不递增子序列。 思路: 1、定义dp[i]为第i个拦截系统的所能打到的最低高度 2、用贪心思想,每次用离导弹最近且可打到的拦截系统,如若没有,则动用新的拦截系统。 反思: 1、由于这题被划分到了动态规划的专题,所以刚开始一直想用LIS做,但是只能想到复杂度过高的算法。后来一经提醒是贪心,则马上秒掉了…#include <iostream>using names

2017-08-12 21:50:26 159

原创 HDU1114 动态规划 背包 多重背包

题意:给定一能容纳一定重量的储钱罐 和 各种面额硬币的重量(数量无穷), 问恰好装满储钱罐时,罐内价值总和之最小。 思路:多重背包模板题。#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;const int MAXN = 500 +

2017-08-12 09:58:28 236

原创 HDU1260 动态规划 简单DP

题意:买电影票有 单人购票 和 相邻两人团购 两种方式,给你队列人数及每人两种购票方式所花时间,问最小花费时间。 思路:定义状态dp[0][i]为i-1未买团票,i买完后的最少花费时间,dp[1][i]为i-1是团票,i买完后的最少花费时间。#include <iostream>#include <cstring>#include <algorithm>#include <iomanip>

2017-08-12 09:54:41 290

原创 POJ2528 线段树 区间更新 离散化

题意:依次将给定区间染色并覆盖之前的颜色, 问最后能看见几种颜色? 思路: 1、首先li <= ri <= 1e7, 若直接建树则必定MLE \ TLE,此时便需要用到离散化处理,也是我新学到的知识。 下面是我学习离散化处理的两个网址: http://www.matrix67.com/blog/archives/108 http://blog.youkuaiyun.com/gokou_ruri/arti

2017-08-11 19:16:27 231

原创 POJ3468 线段树 区间更新

题意:区间更新及求和。 思路:模板题。#include <iostream>#include <cstring>using namespace std;typedef long long ll;const int MAXN = 100000 + 10;ll arr[MAXN], sum[MAXN << 2], add[MAXN << 2];void PushUp(int rt){

2017-08-11 10:56:07 284

原创 HDU1698 线段树 区间更新

题意:区间更新及求和。 思路:模板题。#include <iostream>#include <cstring>using namespace std;const int MAXN = 100000 + 10;int sum[MAXN << 2], add[MAXN << 2];void PushUp(int rt){ sum[rt] = sum[rt << 1] + sum[

2017-08-11 10:25:25 238

原创 POJ2828 线段树 单点更新

题意:将vi依次插入pi+1位置上, 求最后形成的队列。 思路: 1、逆序插入, 因最后插入的必定能得到想要的位置; 2、线段树节点存储对应区间所余空位, 每插入一个vi, 对应区间空位便减一; 3、可以理解成:将每一次插入视为所余空位的最后一次插入。 反思:没能想出“将每一次插入视为所余空位的最后一次插入”这一正确思路。#include <iostream>using namespac

2017-08-10 20:59:01 246

原创 HDU2795 线段树 单点更新 区间最大值

题意:有h*w的告示板, 每张通知的规格为1*wi, 通知张贴的位置优先选最上端的位置, 其次选最左的位置, 求每张通知张贴在第几行? 思路:记录每一行所剩长度, 运用线段树维护区间最大值。左子树值大于wi, 则查询左子树, 否则查询右子树。 反思: 1. 思维不够缜密: 刚开始的想法和正解是相同的, 但考虑到h的范围为1e9, 继而否定了自己的想法。 然而忽略了(所需要用到的)h <= n

2017-08-09 17:30:25 227

原创 HDU1394 线段树 单点更新 求逆序数

第一次写博客~~题意:给定n, 求0~n-1的数列逆序数。并且, 可以依次将头部元素插入尾部, 求由此生成的n-1个数列逆序数的最小值。 思路: 1. 求逆序数: 每插入一个元素, 查询在其之前出现过且比它大的元素数量, 并在线段树中更新。 2. 求最小值:每将a[i]由头部调到尾部, 逆序数减少a[i], 继而增加n-(a[i]+1)。 反思:思维局限, 逆序数不仅可以从前往后计算(即统计

2017-08-09 14:44:48 280

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除