![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
----------- 算法 ----------
SolarDomo
每天都被头像萌醒
展开
-
POJ 1221 整数分解 DP
POJ 1221 题意:将给定的整数N分解为多个整数的和 要求这个序列为回文串 且前半部分为非递减序列 dp[i,j] 表示将整数i分解为以j为开头的序列的方案数 得到状态转移公式 dp[i,j] = dp[i - 2 * j][k] (k * 2 <= i - 2 * j ^ k >= j ) 如果i - j * 2 >= j :dp[i,j]++ 以上公式 的意原创 2016-07-27 13:15:16 · 757 阅读 · 0 评论 -
POJ 2479 DP
[http://poj.org/problem?id=2479](http://poj.org/problem?id=2479) 题意: 对一个数列中的两个不相交的子区间A和B 找到两个区间和的最大值S原创 2016-07-24 18:48:56 · 364 阅读 · 0 评论 -
Uva 1471 用Set优化查询
题意: 一个长度为N的数组,可以从里面删除长度任意(可以为0)的连续子序列,使得之后的最长的连续上升子序列长度最大。最初的想法是遍历两次数组,进行预处理。得出F,G。 F[i] G[i] 分别为一i为结尾和以i为开头的最长连续上升子序列。之后枚举i,j 得到在Num[i] < Num[j] 的情况下得到max( F[i] + G[j] ),即为答案。 复杂度为O(n ^ 2) 然而这题的数据量原创 2015-11-25 16:54:22 · 303 阅读 · 0 评论 -
CodeForces 13C DP
题意:给一个长度为N的数组,每次可以对其中一个数加一或减一。求使数组变为非减的最小操作次数。 Dp( i , j ) = min{ dp(i - 1, k ) } (k <= j ) + fabs(num[i] - w[j]); num[i] w[j] 分别为数组中第i个数 和数组中升序排列后第j个数; min{dp(i - 1,k)} 可以用一个数组(min_dp )原创 2015-11-09 11:20:27 · 826 阅读 · 0 评论 -
POJ 1011 STICKS 搜索 剪枝
题意:某人把若干等长的木棒 随机的切成小段 现在给你这些小段 求原来等长的木棒的最小可能值用DFS来搜索木棒的组合其中的一个最重要的剪枝为: 在构造原始木棒时,我们考虑的第一根木棒(设下标为i)不能构造成功,那么这个原始木棒的长度就是错误的答案。假设我们用i之后的一个木棒k为原始木棒的第一个成功了。那么在构造下一个原始木棒时,我们一定同样会以第I个小木棒为起点来搜索,由上一次的搜索结果我们得知,i原创 2016-07-27 18:25:49 · 434 阅读 · 0 评论 -
POJ 1129 图的染色 暴力
题意:相邻的点着不同的颜色 问一个图最少能用多少种颜色 着色暴力搜索虽然没有用四色定理剪枝 但还是介绍一下四色定理四色定理 最少用4种颜色就能将任意一个图按上述要求染色#include <cstdio>#include <iostream>#include <queue>#include <cstring>#include <algorithm>#define sf scanf#def原创 2016-07-27 19:35:34 · 484 阅读 · 0 评论 -
POJ 2488 DFS水题
POJ 2488 题意:给一个n*m的国际象棋棋盘 问一个马能否不重复走完全部格子 如果有输出字典序最小的路径 行为数字 列为字母 一个格子的坐标为(列字母,行数字)要求字典序最小所以在每次马的行走时 走字典序最小的那一个 wa了两发 没注意到数组的大小 n*m <= 26 所以n,m <= 26 太坑爹!#include <cstdio>#include <iostream>#include原创 2016-07-28 10:35:30 · 426 阅读 · 0 评论 -
HDU 5773 DP LIS变形
题目链接题意:一个非负序列里 0可以变成包括负数在内的任何数 问这个序列的最长严格上升子序列有多长官方给的题解:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的。因此我们可以把0拿出来,对剩下的做O(nlogn)的LIS,统计结果的时候再算上0的数量。为了保证严格递增,我们可以将每个权值S[i]减去i前面0的个数,再做LIS,就能保证结果是严格递增的。条件一:这个最长的上升原创 2016-07-28 19:17:12 · 398 阅读 · 0 评论 -
HDU 5775 Bubble Sort 树状数组
题目链接题意: 1 - N 的一个排列 进行冒泡排序 输出排序时i出现的最左位置和最右位置的差,i 为 1 - N第K个数 出现的三个边界情况为 1.位置K 2.最右位置为 K + (K 右边比第K个数小的数的个数) 3.位置(第k个数的值)最后去差最大的代码:#include <cstdio>#include <iostream>#include <cstring>#include原创 2016-07-28 19:25:48 · 329 阅读 · 0 评论 -
DilWorth定理
反链定义:排序集(A,≤)的一个反链是 A的一个子集 反链中任意的两个元素都不能比 链定义:排序集(A,≤)的一个链是 A的一个子集 链中任意的两个元素都可比 定理一:一个偏序集S中,最长链的大小为p,那么S最小可以划分为p个反链 定理二:一个偏序集S中,最长反链的大小为p,那么S最小可以划分为p个链原创 2016-07-29 17:19:50 · 498 阅读 · 0 评论 -
POJ 2709 水题
[题目(http://poj.org/problem?id=2709)水题 最后配灰色的时候一毫升一毫升的配代码:#include <cstdio>#include <iostream>#include <queue>#include <cstring>#define sf scanf#define pf printfusing namespace std;const int maxn原创 2016-07-29 19:52:06 · 313 阅读 · 0 评论 -
O(N) 的时间求 1 - N 关于 MOD 的逆元
新学的一个求逆元的方法:inv[i] = ( MOD - MOD / i ) * inv[MOD%i] % MOD证明:设t = MOD / i , k = MOD % i则有 t * i + k == 0 % MOD有 -t * i == k % MOD两边同时除以ik得到-t * inv[k] == inv[i] % MOD即inv[i] == -MOD / i * inv[MOD%i]即inv转载 2016-07-30 09:37:51 · 729 阅读 · 0 评论 -
URAL 1057 数位DP
题目链接数位DP DP[i][j][k] 表示第i位 为j 选k个1 的方案数 转移方程 j > 1 DP[i][j][k] = 0; j = 1 DP[i][j][k] = DP[i - 1][1][k - 1] + DP[i - 1][0][k - 1] j = 0 DP[i][j][k] = DP[i - 1][1][k] + DP[i - 1][0][k]初始化 DP[1][1]原创 2016-08-03 20:01:39 · 384 阅读 · 0 评论 -
POJ 1125 最短路 FLOYD
题目链接求一个起点 这个起点到图中所有点的最大距离最短 水题不多说 代码:#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int maxn = 105;const int INF = 0x3f3f3f3f;int Adj[maxn][maxn];int n;void F原创 2016-08-04 22:37:33 · 211 阅读 · 0 评论 -
POJ 1797 图论 Dijkstra
题目链接题意 求起点到终点 的 一个路径 使路径上最短边最长性质:我们将 满足题意的从起点到点N的路径 记为Path(N) 在Path(N) 上 N 的前一个节点 为pre 那么在Path(N)上从起点到pre的路径 就是 Path(pre ) 否则我们可以将Path(pre)替换这条路径 Path(N)上的最短边只会更长代码:#include原创 2016-08-04 22:56:36 · 258 阅读 · 0 评论 -
HDU 2089 数位DP 入门题
[题目](http://acm.hdu.edu.cn/showproblem.php?pid=2089)提议:在n - m中有多少个数不含【4】 和 【62】dp[i][j] 表示第i位为j的答案数这样1. j = 6 dp[i][j] += dp[i - 1][k] (k = 0 ~ 9 ^ k != 4 | 2)2. j = 4 dp[i][j] = 0对于数字N 在计算0 - N原创 2016-08-03 14:48:40 · 383 阅读 · 0 评论 -
HDU 3652 数位DP
题目链接 题意:1 - n中有多少个数 能被13整除 而且包含【13】数位dp状态dp[i][j][k][f] 第i位为j 除以13的余数为k f两个状态 0:没有包含13的个数 1:包含13的个数 状态转移方程: f = 1,j != 1 : dp[i][j][k][f] = SUM{ dp[i - 1][p][ (k - (j * 10 ^ (i - 1) ) + 13 )原创 2016-08-03 16:38:00 · 267 阅读 · 0 评论 -
BestCoder Round #86 HDU 5804,HDU 5805,HDU 5806,HDU 5807
第一题: HDU 5804 链接代码:#include <cstdio>#include <iostream>#include <queue>#include <vector>#include <cstring>#define sf scanf#define pf printfusing namespace std;typedef long long LL;int main(){原创 2016-08-06 22:08:53 · 522 阅读 · 0 评论 -
HUD 4737 数位DP
题目链接题意:给出F()函数 求在[0 - B]中有多少个数的F值小于F(A)方法一:预处理 dp[i][j][st] 表示第i位为j 时 F值不大于st的个数转移方程 dp[i][j][st] = ∑dp[i - 1][k][st - j * (2^(i -1))]代码:#include <cstdio>#include <iostream>#include <queue>#include原创 2016-08-07 11:02:48 · 327 阅读 · 0 评论 -
HDU 4751 二分图判断
题目链接题意: 给一个集合的人和互相之间的关系 问 能不能将这个集合分成两个部分 每个集合之间的人都相互认识判定二分图 染色判定代码:#include <cstdio>#include <iostream>#include <cstring>#define sf scanf#define pf printfusing namespace std;const int maxn = 100原创 2016-08-07 19:44:55 · 385 阅读 · 5 评论 -
HDU 3068 Manacher 模板题
题目链接题意: 求字符串的最长回文长度代码:#include <cstdio>#include <iostream>#include <vector>#include <cstring>#include <algorithm>#define sf scanf#define pf printfusing namespace std;const int maxn = 110000 * 2原创 2016-08-08 11:59:46 · 308 阅读 · 0 评论 -
HDU 3065 AC自动机 模板题
题目链接水题不多说 没关freopen WA了一次代码如下:#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <algorithm>#include <set>#define sf scanf#define pf printfusing namespace std;cons原创 2016-08-05 18:31:38 · 290 阅读 · 0 评论 -
HDU 2896 AC自动机 模式串匹配
题目链接题意:查找主串中出现的模式串 并 输出模式串的编号 模板题#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <algorithm>#include <set>#define sf scanf#define pf printfusing namespace std;c原创 2016-08-05 17:48:27 · 545 阅读 · 0 评论 -
HDU 2222 AC自动机 入门题
题目链接代码如下:#include <cstdio>#include <iostream>#include <cstring>#include <queue>#define sf scanf#define pf printfusing namespace std;const int sigma_size = 26;struct Trie_Node{ int value;//单原创 2016-08-05 15:35:12 · 323 阅读 · 0 评论 -
POJ 3974 Manacher 模板题
题目链接题意:求最长回文子串的长度代码:#include <cstdio>#include <iostream>#include <vector>#include <cstring>#include <algorithm>#define sf scanf#define pf printfusing namespace std;const int maxn = 1000000 * 2原创 2016-08-08 12:09:30 · 311 阅读 · 0 评论 -
HDU 1671 字典树 查找前缀
题目链接题意: 若干个电话号码 是否存在某个号码是另一个号码的前缀将每一个号码都加入一颗字典树中 此时如果这个号码是某个号码的前缀或者某个号码是它的前缀 那么 第一种情况下此号码的节点在某个号码的路径上 第二种情况 在这个号码的路径上存在号码节点#include <cstdio>#include <iostream>#include <cstring>using namespace s原创 2016-08-05 13:21:16 · 337 阅读 · 0 评论 -
HDU 1251 字典树 前缀计数
题目链接加入单词时 路径上每个点得count值都加一 查询直接输出 单词节点的count值#include <cstdio>#include <cstring>#define sf scanf#define pf printfusing namespace std;struct Trie_node{ int count; struct Trie_node* next[26原创 2016-08-05 13:13:05 · 249 阅读 · 0 评论 -
HDU 1075 字典树 树搜索 逆路径输出单词
题目链接题意: 给出一个字典 和 文章 根据字典翻译文章 字典中没有的词不用翻译 标点不用翻译将字典中的所有单词都Insert进一颗字典树中 MAR单词的节点的Eng指针指向它对应的ENGLISH单词节点 所有Eng指针为NULL的不是MAR单词 找到对应的ENGLISH单词节点之后 又pre指针向上直到root 沿途将字母存入temp数组中最后将数组逆序代码:#include <cstdio>原创 2016-08-05 13:09:17 · 532 阅读 · 0 评论 -
POJ 1961 KMP
题目链接题意: 求所有可以 表示成 (S)^K的前缀 输出前缀位置 和 k的最大值代码:#include <cstdio>#include <iostream>#include <vector>#include <cstring>#include <algorithm>#define sf scanf#define pf printfusing namespace std;const原创 2016-08-08 13:09:38 · 212 阅读 · 0 评论 -
POJ 2752 KMP 待AC
题目链接求相等前后缀长度代码:#include <cstdio>#include <iostream>#include <vector>#include <cstring>#include <algorithm>#define sf scanf#define pf printfusing namespace std;const int maxn = 400000 + 50;char原创 2016-08-08 14:02:32 · 239 阅读 · 0 评论 -
HYSBZ 2342 最长双倍回文串 Manacher
题目链接题意: 双倍回文串 为:一个回文串是一个更小的回文串的两倍首先我们用Manacher将字符串扫一遍 得到dis数组 由题意这个回文串一定是4的倍数枚举这个串的中心i 和 小回文串的半径k dis[i] - 1 >= 4 * k 判断是否存在这样的小回文串 如果存在 则小回文串的中心 j = i + (4 * k + 1) / 2 如果dis[j] - 1 >= 2*k 那么存在这样原创 2016-08-08 16:16:53 · 751 阅读 · 1 评论 -
POJ 3080 Blue Jeans 字典树
题目链接题意:给N个文本串 找到在一个在N个文本串中都出现的最长的字典序最小的字串本来找的是KMP 的题 想来半天都不知道怎么用KMP搞 之后发现可以 将每个串的后缀都加入一颗字典树中 字典树中每个节点的value表示一个状态 即 这个串在哪几个序列中出现过 最后在树上深搜 按A C G T 的顺序搜索 最后在逆这树向上打印文本时间复杂度: 一个串有len个后缀 将一个长度为n的串加入原创 2016-08-08 15:08:35 · 258 阅读 · 0 评论 -
HYSBZ 2565 最长双回文串 回文树应用
题目链接题意:求一个最长的由两个回文串拼接来的字串回文树 顺序 逆序 两边扫描文本串 根据 回文树得到的当前最长后缀回文串 记录以i为结尾的在原串中的最长前缀和最长后缀回文串 维护一个max值即可回文树是贴的模板 只是有点点理解#include <stdio.h>#include <iostream>#include <string.h>#include <queue>#defin原创 2016-08-08 22:12:10 · 423 阅读 · 0 评论 -
回文自动机 资料
回文自动机 也叫 回文树 开始学习 先把网上的资料保存起来http://blog.csdn.net/lwfcgz/article/details/48739051http://blog.csdn.net/u013368721/article/details/42100363http://www.cnblogs.com/tmzbot/p/4491559.html原创 2016-08-08 21:21:14 · 527 阅读 · 0 评论 -
CODRFORCES 27E 构造
题目链接:http://codeforces.com/problemset/problem/27/E代码:#include <cstdio>#include <iostream>#include <cstring>#define sf scanf#define pf printfusing namespace std;int prim[] = {2,3,5,7,11,13,17,19,2原创 2016-09-10 22:44:41 · 323 阅读 · 0 评论 -
POJ 2406 Power Strings KMP
题目链接题意:问串S 最多能表示成多少个串的重复 输出重复的最大值代码:#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int maxn = 1000000 + 5;int NEXT[maxn];char str[maxn];int main(){ while( sc原创 2016-08-08 13:11:50 · 222 阅读 · 0 评论 -
POJ 3233 二分求等比数列 矩阵快速幂
题目链接:http://poj.org/problem?id=3233 题意: 求 S =( A + A^2 + A^3 + … + A^k) mod m二分原理(转自AcDreamer大佬): (1)当时, (2)当时,那么有 (3)当时,那么有 代码:#include <cstdio>#include <iostream>#include <cstring>#define sf原创 2016-09-11 22:26:33 · 264 阅读 · 0 评论 -
HDU 4825 Xor Sum 01字典树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825题意:找出集合中与X异或的最大值01字典树模板题代码:#include <cstdio>#include <iostream>#include <queue>#include <cstring>#define sf scanf#define pf printfusing namespac原创 2016-08-10 06:02:10 · 640 阅读 · 0 评论 -
HDU 5536 Chip Factory 01字典树
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5536题意:数组中求 i,j,k 最大的(A[i] + A[j]) xor A[k] i != j != k n^2枚举i,j 同时删除字典树中的A[i] A[j] 之后询问A[i] + A[j] 的最大的A[k] 维护最大异或和代码:#include <cstdio>#include <iost原创 2016-08-10 06:09:16 · 938 阅读 · 0 评论 -
BZOJ 4206 Codechef REBXOR 01字典树
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4260题意: 数组中求 不相交两个区间 两个区间异或和相加最大值代码:#include <cstdio>#include <iostream>#include <queue>#include <cstring>#define sf scanf#define pf printfus原创 2016-08-10 06:29:25 · 361 阅读 · 0 评论