![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
acm算法
nothing is worse
long long ago,there is nothing
展开
-
hdu 4545 魔法串
思路:假设小西字符串为str1[i] , 小明的字符串为str2[j] 遍历一次str1[i] ,查看对于每一个str1[i] 是否有str2[j] == str1[i] 或者 hash[str2[j]][str1[i]] == 1若都存在则输出happy, 否则输出unhappy.注意:每一个输入后要加一个getchar(); 这点wrong了好几次#include using n原创 2013-10-08 23:10:32 · 573 阅读 · 0 评论 -
hdu1081To The Max【动态规划】
#include #include using namespace std;//题意:求二维矩阵中子矩阵的最大和//思路:《编程之美》上的思路,按行枚举所有的子矩阵和,首先确定子矩阵的左右边界假设为第i列和第j列, 1 //然后,把每一行的第i列和第j列之间的元素和看成一个整体,然后按照行来根据一维数组求最大连续和的方法来对这n行中每一行的第i列和第j列元素集求连续和原创 2013-05-13 11:16:40 · 420 阅读 · 0 评论 -
hdu1325Is It A Tree?【并差集】
#include using namespace std;//题意:和题目1272类似,判断给定的有向图是不是一颗树//思路:树的定义:或着是一颗空树,或者为一颗非空树,只有一个根节点,其他的节点构成了m(m > 0)个// 互不相交的有限集合,每一个集合本身又是一颗树//判断方法:1、或者为一颗空树// 2、对于一颗非空树,只有一原创 2013-05-16 22:11:21 · 450 阅读 · 0 评论 -
hdu3874Necklace--树状数组
#include #include #include using namespace std;//思路:1) 首先将询问的区间[L,R]按照R从小到大排序,这样R前面的都小于等于R// 2) 利用树状数组求解,m_hash{value] = index;表示值value存放在m_hash数组的index位置// 并且在m_hash数组中index之前原创 2013-09-04 22:21:05 · 421 阅读 · 0 评论 -
hdu2532Engine 字符串模拟
#include #include #include using namespace std;#define NSIZ 1100typedef struct Node_{char words[12][22];char oldStr[256];int time;int index;int wordsNum;}Node;Node a原创 2013-09-01 14:36:21 · 535 阅读 · 0 评论 -
hdu2846 Repository 字典树
//思路:使用字典树算法//首先把每个单词按照其后缀子串放入到字典树,比如:abcd,我们应该吧abcd, bcd, cd, d都放入字典树中//这里有个问题:同样一个字符串例如:abab,当查找ab时,就会重复计数,所以我们在建树的过程要多加一个标识符//这个标识符表示该子串是不是重复出现在某一个字符串中,并且该字符串总是表示建树过程中最后一个字符串的编号//如果插入的子串编号同原创 2013-09-11 18:06:16 · 490 阅读 · 0 评论 -
hdu 1506 Largest Rectangle in a Histogram[动态规划]
#include using namespace std;////题意:给出n个木板, 宽度为1 ,求最大高度的面积。//暴力搜索的话超时, 改用DP求解////面积公式:sum = max(h[i] * (right[i] - left[i] + 1)) , 0//right[i] 表示h[i]右边大于等于h[i]的最大下标//left[i] 表示h[i]左边大于等于h[原创 2013-04-30 18:26:00 · 413 阅读 · 0 评论 -
hdu2571命运【动态规划】
#include using namespace std;#define IMAX -100000000#define NSIZ 1010int dp[25][NSIZ]; //dp[i][j] 表示从(1,1)到(i,j)处最大能量值int arr[25][NSIZ]; int main(){int t, i, j,n, m, k;s原创 2013-05-06 23:29:45 · 473 阅读 · 0 评论 -
hdu2845Beans[动态规划]
#include using namespace std;//题意:求出矩阵中不连续子数列的最大和,//规则:取[x,y],则[x, y-1],[x, y+1],x+1行,x-1行都不能取//[x, y-1],[x, y+1]表示本行是不连续的//x+1行,x-1行表示本列是不连续的。//思路://1、首先求出每一行的最大值,保存到数组row[]原创 2013-05-09 12:42:58 · 363 阅读 · 0 评论 -
hdu1087Super Jumping! Jumping! Jumping!【动态规划】
#include using namespace std;//题意:求一个数组的严格的递增序列最大和//动态方程:dp[i] = max(dp[i], dp[j] + heigh[i]) , 1#define NSIZ 100010int heigh[NSIZ];int dp[NSIZ];int main(){int i, j, n;int原创 2013-05-11 15:06:45 · 373 阅读 · 0 评论 -
hdu1421搬寝室【动态规划】
#include #include using namespace std;//题意:在n件物品中取k对物品,使得搬运k对物品的有最小疲劳度,疲劳度为(物品i的质量-物品j的质量)^2//思路:首先要对n个物品根据质量大小进行排序。因为这样使得每个相邻的物品的差的绝对值最小//我们用dp[i][j]表示前i件物品中搬运了j对的最小疲劳度//对于第i件物品,i必然不能原创 2013-05-11 16:06:40 · 443 阅读 · 0 评论 -
hdu1009FatMouse' Trade【贪心算法】 hdu 2602 BoneCollector 【01背包】
贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。从许多可以用贪心算法求解的问题中看到原创 2013-05-11 18:09:05 · 624 阅读 · 0 评论 -
hdu1789Doing Homework again【贪心算法】
#include #include using namespace std;//题意:有一组作业,每个作业都有自己的最后期限和分数,只要改作业在自己的最后期限之前完成都可以拿分,//每一种作业只要一天就可以完成了,求最后被罚掉的分数。//思路:1、每一种作业要按照分数大小排序从大到小排序,分数相同的按照最后期限从小到大排序// 2、排序后的作业,对原创 2013-05-12 22:03:33 · 514 阅读 · 0 评论 -
hdu1229还是A+B【acm水题】
#include using namespace std;#define NSIZ 12char num1[NSIZ];char num2[NSIZ];//题意:水题,求2个数最后的k位是否相同,若相同则输出-1,不同则为两者之和,写了2个版本,一个大数版的,一个普通版的//例子1:10001 1 3 则输出-1//例子2:11 21 3 则输出32原创 2013-05-11 22:57:56 · 593 阅读 · 0 评论 -
hdu1257最少拦截系统【贪心算法】
#include #include using namespace std;//题意:求非递增序列组的个数//简单贪心#define NSIZ 300000int flag[NSIZ];int arr[NSIZ];void select(int arr[], int s, int n){int i = s, j = s;flag[原创 2013-05-11 18:10:34 · 444 阅读 · 0 评论 -
hdu1056 HangOver - 二分查找
思路:先打表,然后再二分查找,此时的二分查找要找到满足条件的最小的一个数代码如下:#include using namespace std;#define N 300double dist[N];void init(){ int i = 0; dist[0] = 0; for (i = 1;i < N; ++i) { dist[i] = dist[i - 1] +原创 2013-10-08 11:20:37 · 628 阅读 · 0 评论 -
hdu1198Farm Irrigation -并查集
思路:求无向图的联通分量个数方法:1.对于从A,到K四个正方形,每一条边的中点若有水管则为1,没有水管则为0,按照逆时针方向从上,左,下,右依次排序例如:正方形A可以表示为{1, 1, 0, 0}2. 我们只要判断每一个小正方形的四条边的中点是不是等于其左侧和上侧的正方形的中点,并且同时为1,若相等则归为一类, 此时我们要以给每一个小正方形一个编号 i * n + j 其中(i原创 2013-09-21 22:34:08 · 464 阅读 · 0 评论 -
hdu1023Train Problem II --卡特兰数
#include using namespace std;//大数求解卡特兰数 打表法//公式:C(n + 1) = (4*n - 2)C(n - 1)/(n + 1)#define N 110#define BASE 10int num[N][N];void multi(int a[], int b){int i = 0, carry原创 2013-09-20 16:06:48 · 553 阅读 · 0 评论 -
hdu2067小兔的棋盘--卡特兰数
#include using namespace std;//大数求解卡特兰数 打表法//公式:C(n + 1) = (4*n - 2)C(n - 1)/(n + 1)#define N 40#define BASE 10int num[N][N];void multi(int a[], int b){ int i = 0, carry = 0; for (i = 1;i原创 2013-09-20 16:31:46 · 529 阅读 · 0 评论 -
hdu1130How Many Trees? 卡特兰数
#include using namespace std;//大数求解卡特兰数 打表法//公式:C(n + 1) = (4*n - 2)C(n - 1)/(n + 1)#define N 110#define BASE 10int num[N][N];void multi(int a[], int b){int i = 0, carry =原创 2013-09-20 11:53:07 · 590 阅读 · 0 评论 -
hdu 4544 湫湫系列故事——消灭兔子, 贪心算法+小顶堆
思路:贪心算法1)把所有兔子的血量安从大到小排序,并且把箭的伤害从大到小排序2)排序后,从第一只兔子开始,把每支能杀死该兔子的箭的价格放到一个小顶堆里3)若堆不空,获得小顶堆的堆顶元素,删除之,直到所有兔子都能被射死或者找不到一支射死兔子的箭结束代码如下:#include #include #include #include using namespace st原创 2013-10-05 19:06:05 · 751 阅读 · 0 评论 -
hdu 4221 Greedy 贪心算法
题意:做任务,每一个任务i都有花费时间ci, 截止时间di, penalty = max(Ti - di) Ti为第i个任务的实际完成时间,di为其截至时间,要求所有任务的penalty尽可能的小一个思路:贪心算法:要求截至日期最小的应该最早完成,因为拖得越晚,penalty越大#include #include using namespace std;#define N 10原创 2013-10-05 17:08:46 · 810 阅读 · 0 评论 -
hdu 4286 Alice and Bob --贪心
思路:(参考网络上的思路)先对坐标排序,若h不等,则对h升序排序,否则对w进行升序排序排序后之后,扫描Alice的手牌,把所有Bob[j].h等于Alice[i].h的Bob[j].w放入一个集合中,并且在该集合中找到第一个大于Alice[i].w的Bob[x].w那么Bob[x-1].w就是跟Alice[i].w最接近的牌,若存在则删除之。#include #inclu原创 2013-10-05 11:28:45 · 728 阅读 · 0 评论 -
hdu 3998 Sequence 贪心算法+最长递增子序列+二分查找(好题目)
题意:给定一个数组,求该数组中严格最长递增子序列的长度和相应的最长子序列的个数,在求最长子序列的有多少种时,数组中每一个元素只能使用一次思路:1. 求最长递增子序列的长度时,我们使用二分查找的方法求,具体的操作是维护一个辅助数组,这个辅助数组dp[k]中保存着当前已经获得最长递增子序列,k表示当前的辅助数组中递增序列的个数,当处理原数组中下一个元素data[i]时,1)若data[i] >原创 2013-10-04 17:29:33 · 1129 阅读 · 0 评论 -
hdu1300Pearls【动态规划】
#include using namespace std;//dp[i]是买够i种产品的最少话费,//每种产品都可以以档次高和前面档次低的一起买//状态方程为dp[i] = min(dp[i], dp[j - 1] + sum), sum为(a[0] + ..+a[j] + 10) , 0 #define MSIZ 1010#define NSIZ 110原创 2013-05-07 23:00:56 · 428 阅读 · 0 评论 -
hdu1227Fast Food【动态规划】
#includeusing namespace std;#define NSIZ 300#define MSIZ 30//题意:在n个饭店之间建立k个仓库,使得n个饭店到k个仓库的距离之和最小//思路:首先输入n个饭店的位置,pos[i]表示第i个饭店在坐标轴上的坐标//其次,用dist[i][j]数组标志在第i个饭店和第j个饭店之间建立一个仓库,i和j之间原创 2013-05-08 23:56:57 · 519 阅读 · 0 评论 -
hdu3172Virtual Friends【并差集】
#include #include #include using namespace std;//题意:给出每一组字符串,输出当前形成朋友的个数//如第一组:aa bb 输出2//第二组:bb cc 输出3//思路:并差集求解//使用map对每个字符串进行标志计数,以便于后边并差集操作#define NSIZ 100010int p原创 2013-05-14 22:52:52 · 442 阅读 · 0 评论 -
hdu3018Ant Trip【并差集】
#include using namespace std;//题意:图的欧拉回路或者欧拉通路,通过图中每条边一次且仅一次,并且过每一顶点的通路,要多少画才能完成//思路:1、若某个连同图的所有节点的度数都是偶数,则需要一笔// 2、若某个连通图的节点有n个节点度数为奇数,则需要n/2笔// 3、若某个节点度度数为0, 忽略#define原创 2013-05-15 20:48:38 · 634 阅读 · 0 评论 -
hdu1856More is better【并差集】
#include using namespace std;//题意:求最大一组朋友的人的个数,要求:只能为1或者该组中所有人都是互为(间接的或者直接的)朋友//思路:并差集#define NSIZ 10000010int parent[NSIZ];int myrank[NSIZ];void make_set(int n){int i;原创 2013-05-15 21:58:37 · 383 阅读 · 0 评论 -
hdu 1247 Hat’s Words 字典树
典型的字典树://思路:单词是小写的//1)把所有的单词添加到字典树中//2)然后针对每一个单词,把这个单词分成2个部分,分别在字典树中查询,如果同时存在则输出该单词,否则继续分成2个部分#include#include#includeusingnamespace std;#define NSIZ 50010#defi原创 2013-09-11 11:33:53 · 413 阅读 · 0 评论 -
hdu4099Revenge of Fibonacci 字典树+Fibnocci
//思路://首先利用大数相加暴力求解前100000的Fabnocci数列, 并把每一个数列插入到字典树中//然后对每一个输入在字典树中进行查找,若找到则返回下标最小的数,若没有找到则返回-1//注意:1)大数相加的过程中,由于题目求的是最高位的前40位,但是由于空间性能,我们可以数列精确到前55位即可,否则空间不够用// 精确到50多位是为了防止原创 2013-09-11 23:21:51 · 519 阅读 · 0 评论 -
hdu4287Intelligent IME 字典树
思路:把后面的字符串转换为数字加入到字典树中,然后再重新检索一下原来的数字的个数注意:由于有多个实例,所以每个实例结束后必须清空一下字典树#include#include#includeusingnamespace std;#define NSIZ 5010#define WS 100#define N原创 2013-09-12 17:00:15 · 615 阅读 · 0 评论 -
hdu2072 单词数 和 hdu4018 Parsing URL
hdu 2072 单词数#include #include #include using namespace std;#define N 10000char str[N];char word[N];map m_hash;int main(){ int i, n, t; char * p = 0; while(gets(str)) { if (str[0原创 2013-10-03 19:15:30 · 581 阅读 · 0 评论 -
hdu2057 A + B Again
题意:求2个十六进制数加法的和写了2个版本的代码一个版本按照大数求解#include #include using namespace std;#define N 200char str1[N];char str2[N];int num1[N];int num2[N];int num3[N];int m_hash[256];void init(){ m_原创 2013-10-02 22:41:35 · 564 阅读 · 0 评论 -
hdu1501Zipper -- 经典DFS
经典的DFS题意:有3个字符串,问第三个字符串能否有前2个字符串拼接起来,拼接时前2个字符串中字符在新字符串中的先后相对位置不能改变。思路:DFS,前2个字符串,从前向后搜索看能否能拼成第三个字符串的顺序,另外我们需要增加一个辅助数组进行剪枝操作,不然会有重复的搜索的。m_hash[i][j] = 1 表示第一个数组的第i位比较到第2个数组的第j位时已经被搜索过了,以后若遇到m_has原创 2013-10-01 23:14:02 · 578 阅读 · 0 评论 -
hdu 1880 魔咒词典--字符串简单查找
思路:使用两个二维数组分别存储Key和Value, 当找到Key,时输出Value; 找到Value时输出Key;注意:1)此题使用STL 中map会 Memory Limit Exceeded 2) Key长度不会超过20, Value 长度不会超过 80, 刚开始搞反了,一直出现Output Limit Exceeded#include #inc原创 2013-10-02 16:36:28 · 818 阅读 · 0 评论 -
hdu 2100 Lovekey 大数加法
思路:26进制的大数相加注意:1) AAAAA * (*表示任意一个字符) 为* 2) AAAA AAAA 只能输出一个A 3) 数组开的大一点,比如说500#include using namespace std;#define N 500char stra[N];char strb[N];char原创 2013-10-02 13:29:41 · 733 阅读 · 0 评论 -
manacher算法求最长回文串 和 hdu 3068 最长回文串
hdu 3068 最长回文 (manacher算法)1. 回文串定义回文串是一个正读和反读都一样的字符串,比如“aba”或者“abba”等等就是回文串。2. 最长回文子串方法最长回文子串的长度方法可以有三种方法:1) 朴素算法是依次以每一个字符为中心向两侧进行扩展,时间复杂度是O(N^2)的;2) 利用扩展的KMP算法,时间复杂度也很快O(N*logN)。3) mana原创 2013-10-01 17:38:10 · 806 阅读 · 0 评论 -
hdu 4148 Length of S(n) --字符串找规律
题目:S(1)=1,S(2)=11,S(3)=21,S(4)=1211,S(5)=111221,S(6)=312211,....求S(n)的长度。思路:题目很简单就是压缩字符串, 比如:s[4] = 1211 那么是s[5]中内容就是1一个1即11, 一个2即12和2个1即21, 合起来s[5]就是11 12 21 同理s[5] = 111221 那么原创 2013-10-01 20:22:29 · 799 阅读 · 0 评论 -
hdu2594Simpsons’ Hidden Talents--KMP算法
思路:利用KMP算法求出第二个字符串最后一个字符的后缀长度即可。#include using namespace std;#define N 50010char parent[N];char child[N];int Next[N];void getNext(char child[]){ int n = strlen(child); int i = 0,原创 2013-09-30 21:55:48 · 480 阅读 · 0 评论