算法题目
happen_zhang
想要过什么样的生活你自己决定
展开
-
后缀数组的实现和字符串匹配
字符串后缀:从字符串的某个位置开始到字符串末尾的子串。 后缀数组:指将某个字符串的所有后缀按照字典序排序后得到的数组,但数组并不直接保存后缀字符串,只保存对应的其实位置。 S[]="suffixarray"的后缀数组sa[]isa[i]S[sa[i]...]011'\0'(空串)16array原创 2013-09-28 20:25:36 · 2356 阅读 · 0 评论 -
hdu 1677 Nested Dolls
hdu 1677 Nested Dolls 题意: 如果一个布娃娃a的h和w都大于另一个布娃娃b的h和w, 那么b就能嵌套在a里面, 要求所有娃娃嵌套后的最小个数. 先对娃娃的w按从大到小排序, 如果w相等, 则按h从小到大排序, 求出lis.#include #include using namespace std; #define MAX原创 2013-09-04 00:06:10 · 1250 阅读 · 0 评论 -
hdu 2444 The Accomodation of Students
hdu 2444 The Accomodation of Students 二分图的判断和最大匹配, 二分图还有一个名字叫"双色图"吧, 顾名思义吧, 图中的任一条边相连的两个顶点颜色是不同的哦.这就可以把图分成两部分啦, 假设一部分是白色, 一部分是黑色, 那么二分图中的任一边都是连着两个不同颜色的顶点了. 题目需要判断n学生的关系是否满足原创 2013-09-03 23:56:05 · 790 阅读 · 0 评论 -
hdu 2063 过山车
hdu 2063 过山车 二分图最大匹配.#include #include #define MAX 505bool map[MAX][MAX];bool visited[MAX];int match[MAX];int k, n, m;bool dfs(int v) { int i; for (i = 1; i <= m; i++) { if (原创 2013-09-03 23:47:24 · 776 阅读 · 0 评论 -
hdu xxxx Peragrams
PeragramsTime Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)Total Submission(s) : 1 Accepted Submission(s) : 1Font: Times New Roman | Verdana | GeorgiaFo原创 2013-09-09 08:27:41 · 1271 阅读 · 0 评论 -
hdu 1513 Palindrome
hdu 1513 Palindrome 求出字符串的顺序和逆序的最长公共子序列的长度, 插入数 = 字符串的长度 - 最长公共子序列长度。 这道题给出的是最长可以5000的字符串长度哦,假如使用一般的方法来开个二维数组,那么内存会不够的啦, 那么就用滚动数组吧。 这道题需要的是最长公共子序列的长度, 那么可以放弃一些之前的状态, 因为只需要dp原创 2013-09-03 00:42:02 · 679 阅读 · 0 评论 -
hdu 1159 Common Subsequence
hdu 1159 Common Subsequence 最长公共子序列的模板题啦。 这里有一个关于lcs问题的分析 最长公共子序列dp解法#include #include #define MAX 1005int dp[MAX][MAX];char a[MAX], b[MAX];inline int max(int a, i原创 2013-09-03 00:20:37 · 449 阅读 · 0 评论 -
hdu 2546 饭卡
hdu 2546 饭卡 01背包...#include #include #include using namespace std;#define MAX 1005int dp[MAX], c[MAX];int n, v;inline int max(int a, int b) { return a > b ? a : b;}inline void原创 2013-09-02 00:24:57 · 572 阅读 · 0 评论 -
hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 01背包的对物品的选择方案只有 0(不拿) 和 1(拿)吧, 完全背包对一件物品i的选择就有 k 种啦, k 多重背包, 拆分物品分成多件, 这里是用2的幂作为拆分因子的. 假如当一件物品i的数量c和价值p的乘积c*p大于背包总量时, 可以认为物品i的数量无限啦, 所以就可原创 2013-09-02 00:21:32 · 647 阅读 · 0 评论 -
hdu 1248 寒冰王座
hdu 1248 寒冰王座 简单完全背包...#include #include #define MAX 10005int dp[MAX];int p[4] = {0, 150, 200, 350};inline int max(int a, int b) { return a > b ? a : b;}int main() { int T, mon原创 2013-09-02 00:08:50 · 836 阅读 · 0 评论 -
hdu 1257 最小拦截数
hdu 1257 最小拦截数 最小递增子序列.#include #define MAX 30005#define INF 0xffffffint d[MAX];int a[MAX];int binSearch(int* arr, int left, int right, int key) { int mid; while (left < right) {原创 2013-09-04 00:10:40 · 626 阅读 · 0 评论 -
不断减少时间复杂度的一个例子
问题:给出N张写有数字(k1, k2, ..., kn)的牌 和 一个数字M, 从中抽4次(每抽完一次要放回), 判断是否存在抽取4次牌上数字的和为M的组合是否存在。 1 输入:n = 3, m = 10, k = {1, 3, 5} n = 3, m = 9, k = {1, 3 , 5} 输出:yes(原创 2013-09-11 09:39:33 · 2164 阅读 · 0 评论 -
反复推进区间开头和末尾, 求解最小区间
给出一个n个整数的序列,求出最小的连续序列长度,使得ai + a(i+1) + ... + a(t)的和不小于S。 (1 比如: 输入 n = 10, S = 15, a = {5, 1, 3, 5, 10, 7, 4, 9, 2, 8} 输入 n = 5, S = 11, a = {1, 2, 3, 4, 5}原创 2013-09-15 16:56:38 · 865 阅读 · 0 评论 -
分桶法和平方分割(对区间的操作)
分桶法:把一排物品或者平面分成桶,每个桶饭分别维护自己的内部信息,以达到高效计算的目的的方法。 平方分割:把一排n个元素中每√n个元素分在一个桶内进行维护的方法,使对区间操作的时间复杂度降为O(√n)。 类似线段树哦。 给定一个n个整数的数列a1, a2, a3, ..., an和m个三元组表示的查询。对于每个查询(i, j, k)输出原创 2013-09-25 22:21:24 · 2587 阅读 · 1 评论 -
对字符序列循环向左(右)移动的技巧
给出一个字符序列S,求对S向左(右)循环移动i后的字符序列。 比如:S = abcdefg, i = 3, 则操作完成后S = defgabc (向右同理哦) 技巧:假如S = abcdefg, i = 3, 那么可以进行如下操作: 1) 对S的前i个字符进行翻转, 对于上例,则可以得到 abc => cba 2) 对S中i以原创 2013-09-28 18:40:28 · 2002 阅读 · 0 评论 -
hdu 1035 Robot Motion
hdu 1035 Robot Motion 深搜。#include #include #define MAX_N 11char map[MAX_N][MAX_N];int visited[MAX_N][MAX_N];int n, m;int sx, sy;int step, loopStep;bool dfs(int x, int原创 2013-09-15 17:14:05 · 821 阅读 · 0 评论 -
LCP数组的实现和最长公共连续子串
LCP数组(Longest Common Prefix Array, 高度数组):是由后缀数组中相邻两个后缀的最长公共前缀的长度组成的数组。 假设字符串S, 后缀数组sa, LCP数组lcp, 那么有后缀S[sa[i]...]与S[sa[i + 1]...]的最长公共前缀的长度为lcp[i]。 lcp的计算: (后缀数组的实现)假设S[i...]与S[sa[ra原创 2013-09-29 21:24:21 · 4818 阅读 · 0 评论 -
hdu 2571 命运
hdu 2571 命运 动态规划, dp[i][j] = max(dp[i - 1][j], dp[i][j - 1], dp[i][j / k])#include #define MAX 1005#define INF -0xffffff#define max(a, b) (a > b ? a : b) int dp[21][MAX];int m原创 2013-09-13 14:42:31 · 575 阅读 · 0 评论 -
hdu 1711 Number Sequence
hdu 1711 Number Sequence kmp基础题.#include #define MAX 10005int n, m;int a[MAX*100], b[MAX];int next[MAX];void getNext(int* arr, int* next) { int j, k; j = 0; k = -1;原创 2013-09-12 14:15:53 · 660 阅读 · 0 评论 -
hdu 1867 A + B for you again
hdu 1867 A + B for you again 题目没有说明输入一定是前一个字符串的后缀和后一个字符串匹配,所以需要进行两次kmp匹配,然后得出最大的匹配数。#include #include #define MAX 100005char strA[MAX], strB[MAX];int next[MAX];void getNext(char*原创 2013-09-13 10:36:16 · 747 阅读 · 0 评论 -
hdu 2594 Simpsons’ Hidden Talents
hdu 2594 Simpsons’ Hidden Talents 求第一个字符串StrA的前缀和第二个字符串strB的后缀的最大长度. 只要把strA当做模式串去匹配strB就可以啦, 不过还要注意被匹配串strB的长度哦。 例如 strA = 'abcabcabcabc', strB = 'abcabcabcabcabc' 答案却是 ab原创 2013-09-12 15:24:24 · 784 阅读 · 0 评论 -
hdu 1203 I NEED A OFFER!
hdu 1203 I NEED A OFFER! 01背包. 题目中要求求出至少拿到一个offer的概率, 这样不好求, 那就求它的对立面, 即 拿不到任何一个offer的最小概率, 这样就可以转为01背包了.#include #define MAX 10005double dp[MAX], p[MAX];int w[MAX];inline d原创 2013-09-02 00:03:05 · 562 阅读 · 0 评论 -
hdu 1548 A strange lift
hdu 1548 A strange lift 广搜, 最短路径也可以做。#include #include using namespace std;#define MAX 205struct node { int floor, k; int step;};int n, a, b;node floors[MAX];bool原创 2013-09-07 19:17:49 · 678 阅读 · 0 评论 -
hdu 1156 Color the ball
hdu 1156 Color the ball 直接拿数组来做的话会超时...... 那就线段树吧,这道题主要是线段树的更新啦, 只要树上的某个节点的区间符合需要更新的区间,OK,那就只更新该节点就i行了, 而不用一直更新到叶子结点,不然的话效率就降到到O(n^2)了... #include #include #define MAX原创 2013-08-29 23:20:44 · 1067 阅读 · 0 评论 -
hdu 4027 Can you answer these queries?
hdu 4027 Can you answer these queries? 线段树#include #include #include #define MAX 400000struct node { int left, right; __int64 val; int flag;};node tree[MAX];void buildTree(int原创 2013-08-29 23:26:46 · 601 阅读 · 0 评论 -
hdu 4031 Attack
hdu 4031 Attack 童鞋说用树状数组做, 知识点是 区间改,单点查。#include #include #define MAX 20001struct AttackBound { int left, right;};int attackNum[MAX];int lowbit(int x) { return x & (-x);}void原创 2013-08-29 23:32:49 · 725 阅读 · 0 评论 -
hdu 1166 敌兵布阵
hdu 1166 敌兵布阵 这是一道树状数组的入门题啦. 学习树状数组的时候多拿笔算算就比较好理解为什么算法的查询和修改都是logn的了. c[i] = a[i - 2^k + 1] + a[i - 2^k + 2] + ... + a[i], 其中k为i的二进制表示最后几位零的个数, 如i=8, 那么1000三个0咯, 那么c[8] = a[原创 2013-08-27 00:14:12 · 543 阅读 · 0 评论 -
hdu 1075 What Are You Talking Abou
hdu 1075 What Are You Talking About 字典树啦, 指针处理起来要小心一点哦, 而且字典树的代码又有点长, 有模板直接用就很爽啦.#include #include #include #define SIZE 26#define LENGTH 15struct TrieNode { char* en; TrieN原创 2013-08-27 23:48:10 · 796 阅读 · 0 评论 -
hdu 1372 Knight Moves
hdu 1372 Knight Moves 广搜, 那个Knight是走"日"字的, 就像中古想起里面的马走法一样哦, 那么它在不出范围的情况下就有8个方向哦. #include #include #include using namespace std;struct cell { int x, y; int step;};原创 2013-08-27 23:40:14 · 622 阅读 · 0 评论 -
hdu 1026 Ignatius and the Princess I
hdu 1026 Ignatius and the Princess I 题目要求的是从(0, 0)到(n-1, m-1)的最小秒数啦, 首先想到的就是广搜啦, 这道题要求输出搜索过的路径哦, 那么就需要一个额外的数组来记录了. 用turn[][]数组来记录每次转过的方向, 一次广搜结束后, 然后再从终点顺着走回来, 就可完成路径的记录啦.#incl原创 2013-08-27 23:33:05 · 546 阅读 · 0 评论 -
hdu 1429 胜利大逃亡(续)
hdu 1429 胜利大逃亡(续) 这是一道广搜题. 刚开始看有点思路, 但是实现起来需要定义一些相关的结构体,比较麻烦.尤其是怎么处理拿到钥匙和开门...... 下面这种方法能为下次做类似的题提供更多的想法. 后来看到了某大神的一种更好的办法来处理钥匙和开门的问题, 那就是位运算来模拟拿钥匙和开门. 看了一篇思路就很清晰了.原创 2013-08-26 23:33:15 · 1520 阅读 · 0 评论 -
hdu 2616 Kill the monster
hdu 2616 Kill the monster 普通的深搜题目 #include #include #define INF 0xffffffint cSpell[15], dSpell[15];int visited[15];int n, m;int min;void dfs(int hp, int cnt) { int i;原创 2013-08-27 23:15:19 · 607 阅读 · 0 评论 -
hdu 1754 I Hate it
hdu 1754 I Hate it 线段树#include#include#include#includeusing namespace std;int tree[800005];void build(int left,int right,int root){ if(left==right) { scanf("%d",&tr原创 2013-08-29 23:24:20 · 567 阅读 · 0 评论 -
hdu 3068 最长回文
hdu 3068 最长回文 Manacher算法求最大的回文串长度#include #include int min(int a, int b) { return a > b ? b : a;}char oldStr[110005], newStr[220010];int p[220010];int main() { int max原创 2013-08-30 23:39:23 · 543 阅读 · 0 评论 -
hdu 2717 Catch That Cow
hdu 2717 Catch That Cow 广搜.#include #include using namespace std;#define MAX 100005struct node { int pos; int step;};int n, k;bool visited[MAX];int bfs(int s) {原创 2013-09-08 12:47:58 · 723 阅读 · 0 评论 -
hdu 2680 Choose the best route
hdu 2680 Choose the best route 反向建图, 然后计算终点到各点的最短路径.#include #include using namespace std;#define MAX 1001#define INF 0xffffffint map[MAX][MAX];bool visited[MAX];int lowco原创 2013-09-07 19:22:46 · 738 阅读 · 0 评论 -
hdu 2952 Counting Sheep
hdu 2952 Counting Sheep 简单深搜.#include #include #define MAX 105int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};char map[MAX][MAX];bool visited[MAX][MAX];int T;int n, m;void dfs(int x,原创 2013-09-08 13:54:47 · 733 阅读 · 0 评论 -
hdu 2095 find your present (2)
hdu 2095 find your present (2) ^(异或)运算, 0 ^ a = a, a ^ b ^ b = a, a ^ (偶数个)b = a, 那么 0 ^ a ^ a = 0咯.#include int main() { int n; int k, a; int i; while (scanf("%d", &n) != EO原创 2013-09-08 11:30:09 · 686 阅读 · 0 评论 -
hdu 1217 Arbitrage
hdu 1217 Arbitrage 题意:判断是否有一种货币通过和其它不同的货币的汇率进行兑换, 最后是否会多出原来的价值.比如: 1美元去兑换, 1*0.5*10.0*0.21 = 1.05. Flody最短路径.#include #include #include using namespace std;#define MAX 35dou原创 2013-09-08 09:36:13 · 717 阅读 · 0 评论 -
hdu 2112 HDU Today
hdu 2112 HDU Today 求最短路径。 题目是双向图哦, 终点起点一样的话要输出0哦。#include #include #include #include using namespace std;#define MAX 200#define INF 0xffffffint g[MAX][MAX];bool原创 2013-09-07 11:36:34 · 899 阅读 · 0 评论