算法入门经典
文章平均质量分 64
AledaLee
个人博客已经迁移到了https://sites.google.com/site/lishuo02wiki/,主要是一些技术的分享,有需要的可以访问。
展开
-
大数加法(bign)
晕死呀,,,昨天的大数的题目真心没有写好,,错了好几次才写对,心里真不是什么滋味呢.今天狠下心来又总结了一下大数的问题,,还是比较麻烦的.如果用java写的话也就那么几行就完事了,,,因为有处理这个东西的专门函数,而且还能处理各种运算,,,只要查Api就行了.但是,如果要是用c写的话,还是比较麻烦的..主要是:1,格式弄不好,其实最优秀的算法,应该是开始的时候就应该原创 2013-03-13 22:13:57 · 1138 阅读 · 0 评论 -
8.4.4(选择不相交的区间)
这题目是一道简单的贪心,,发现了一点贪心的规律,贪心,故名思议,那就是一定要当前选择的就是最优的,是动态规划的一种,,这种解决方法就类似于,现实生活中,解决问题的方法一样,第一,你一定要清晰的知道,自己解决的问题,第二,你要能够清晰的分清状况,能够将问题步步分解第三.检查自己是不是漏掉了什么情况简单,贴出代码:#include #include #inclu原创 2013-03-08 19:28:02 · 1758 阅读 · 2 评论 -
8.4.3(乘船问题_简单贪心)
很简单的一个小贪心,贴出代码:#include #include #include #include #include using namespace std;const int maxn = 1111l; int n;int c;int a[maxn];int main(){ while (scanf("%d%d", &n, &c) != EOF原创 2013-03-08 18:01:32 · 1658 阅读 · 1 评论 -
8.4.1(最优装载问题_简单贪心)
很简单的一个贪心方法,,一般是不是贪心都要先排序呀???#include #include #include #include #include using namespace std;const int maxn = 1111;int n;int a[maxn];int main(){ while (scanf("%d", &n) != EOF) {原创 2013-03-08 16:30:39 · 1185 阅读 · 0 评论 -
8.3.5(最大值最小化_二分查找)
晕死了,,,白写了那么多,也是不会,,,等以后再来解决这个问题吧;现在写也是白写了,,昨天没有写出来,,贴出别人的代码:#include#include#includelong long a[510], n, m;int sep[510], cases;bool p(long long x){ long long sum=0, done=m-1; int i;原创 2013-03-08 16:19:35 · 1675 阅读 · 0 评论 -
8.2.3(二分查找)
晕死,,,这崩溃了=- =要想索引难道还要建个链表么????诶,,,我发现自己要是做的不多的题目的话,,,就不知道个什么思路,#include #include #include #include #include using namespace std;const int maxn = 11111;int n;int a[maxn];原创 2013-03-07 20:51:20 · 871 阅读 · 0 评论 -
HDU-1231(求最大序列和)
都快晕死了,,,本来以为改来改去是改不正确的...没想到居然改正确了,,真心崩溃了- -#0(n)的算法贴出代码:#include #include #include #include //#define max(a, b) (a) > (b) ? a : b using namespace std;int a[11111];int s[11111];in原创 2013-03-07 13:27:53 · 873 阅读 · 0 评论 -
8.1.1(最大连续和)
记得很早以前就做这个题目都不会,,晕死,,这次终于弄清楚了,,前人的经验是无比的重要且帮助重大的呀!!!贴出代码:#include #include #include #include #define max(a, b) (a) > (b) ? a : b using namespace std;int a[11111];int s[11111];int n;原创 2013-03-07 10:52:35 · 1005 阅读 · 0 评论 -
8.4(范围统计)
求[a,b]范围内的数字的个数;崩溃,...直接用STL的upper_bound和lower_bound函数#include #include #include #include #include using namespace std;const int maxn = 11111;int n;int v;int a[maxn];int main(){原创 2013-03-07 21:08:28 · 939 阅读 · 0 评论 -
9.1.2(简单DP---递推法、记忆化搜素)
基础dp,递推法的有点就是简单,从下到上,依次求得答案,而且不用多次计算已经计算得到的dp,需要注意的就是开始一定要先把最底层算出来,然后从第二层开始地推而记忆化搜索呢,一定要注意的就是开始的时候的赋值,将所有的dp都赋值成-1,而去掉重复计算的方法呢,也就很简单了,就是判断dp是不是负数,如果是负数,说明还没有更新过次结点,就可以计算,如果大于零了,,说明已经计算过了原创 2013-03-08 20:26:49 · 1123 阅读 · 0 评论 -
9.2.1(矩形嵌套_最长子序列方法)
原来就是初始化的时候要把所有的d都初始化为1;因为每一个点的,初始化结果就是1;开始的时候没有意识到,,,#include #include #include #include #include #define max(a, b) (a) > (b) ? (a) : (b)using namespace std;const int maxn = 1005;str原创 2013-03-09 10:50:24 · 949 阅读 · 0 评论 -
8.4.5(区间选点_简单贪心)
和那个选择不相交区间类似呀,,也是先排序,,然后好好的分析.处理好情况就行..贴出代码:#include #include #include #include #include using namespace std;const int maxn = 1111;int n;struct node{ int x; int y;}q[maxn], temp;原创 2013-03-08 19:43:41 · 1362 阅读 · 1 评论 -
9.3.2(规划方向)
其实不用存着w和v的贴出代码:#include #include #include #include using namespace std;const int maxn = 1111;int N;int V;int f[maxn][maxn];int main(){ while (scanf("%d%d", &V, &N) != EOF) { in原创 2013-03-11 13:34:16 · 738 阅读 · 0 评论 -
9.3.1(0_1背包)
我觉得我的这个是对的吧???因为我每次得到的都是最优解,所以应该是正确的贴出,让大家给看看:#include #include #include #include #include using namespace std;const int maxn = 1005;int V;int N;struct node{ int v; in原创 2013-03-10 22:04:47 · 879 阅读 · 0 评论 -
9.2.3(递推法_硬币问题)
用递推法求硬币问题, 很经典,,但是自己好困,,想睡觉了- -# 晕死,..贴出代码,等醒来的时候看一下好了#include #include #include #include #define MIN(a, b) (a) < (b) ? a : b#define MAX(a, b) (a) > (b) ? a : busing namespace std;c原创 2013-03-10 19:48:40 · 1078 阅读 · 0 评论 -
9.3.1(0_1背包)
这是个很经典的背包问题咯,很简单吧,就是先排序,选择可以选择的最大有效物品贴出我的代码:#include #include #include #include #include using namespace std;const int maxn = 1005;int V;int N;struct node{ int v; int w;}n[maxn原创 2013-03-10 21:54:22 · 1073 阅读 · 0 评论 -
9.2.3(记忆化搜索_硬币问题)
真心好累,诶诶,如果自己不累点也就显示不出自己的价值了,所以还是累点好呀,呵呵.这个记忆化搜索还是不怎么会呢,,用vis好一点,,,不知道,这个写前面的程序可以不可以..一会我看一下,,这里面有一个陷阱就是,,vis[0] 你默认是0就好了,,要不然是求不出来的.代码:#include #include #include #include #include us原创 2013-03-10 20:53:51 · 913 阅读 · 0 评论 -
8.4.2(部分背包问题)
很简单的一道题目,,主要是因为题目中的那个最后一句话,价值和重量成正比,所以,才得根据比值来排序的..而且好像不能重载符号,,,诶贴出代码:#include #include #include #include #include using namespace std;const int maxn = 11111;int n;struct node{原创 2013-03-08 17:31:43 · 1257 阅读 · 0 评论 -
9.2.1(DAG的dp)
晕死,,,反正是对不了..都是自己写代码的风格不行呀,,怎么也写不对了- -#烦死了都,,,不知道是怎么错了..好像和别人写的差不多呀自己的:#include #include #include #include #define max(a, b) (a) > (b) ? (a) : (b)using namespace std;struct node{原创 2013-03-08 21:46:42 · 911 阅读 · 0 评论 -
9.2.2(矩形嵌套_简单动态规划)
晕死了,,总算找到了自己错在哪里了,,,人家标程用的dp求法是记忆化搜索,,你的那个记忆化虽然是有了,,,但是,你没有一次性将结果用好,也就是你没有一次dp就把结果存过去,看代码吧:#include #include #include #include #define max(a, b) (a) > (b) ? (a) : (b)using namespace原创 2013-03-09 09:13:00 · 1322 阅读 · 1 评论 -
8.2.2(求第k大的数)
求出第k大的数,这个好像我就遇到过,,,原来是用快排弄的,,诶,,好像是快了点,,有的题目用到的思想真是让人捉摸不透呀...贴出代码:#include #include #include #include using namespace std;const int maxn = 11111;int n;int k;int a[maxn];int Sol原创 2013-03-07 20:14:43 · 947 阅读 · 0 评论 -
7.5.3-4(八数码问题+hash表)
这个游戏我依然记得小时候玩过呢...呵呵就是那个拼图的呗,,,没想到用计算机也能实现,不过就是真的狠麻烦呢...用到的知识真的是不少,,BFS以前小case的...现在也写不出来了,,,昨天居然还用栈来实现....崩溃了都,,,这个还是实现了,,不过没有写好,,,自己看看,,写的是个什么东西,,,而且效率太低,,,当然 下面还是附上标准的代码吧自己的:#incl原创 2013-03-06 21:35:13 · 1698 阅读 · 0 评论 -
8.1.2(最大连续和)
这个比较好.....#include #include #include #include using namespace std;int best;int A[111];int s[111];int n;int max(int a, int b){ return a > b ? a : b;}int Solve(){ s[0] = 0; for原创 2013-03-06 22:16:49 · 823 阅读 · 0 评论 -
求Cantor数
这个比较需要注意的点就是要分开偶数和奇数的区别.贴出代码:#include #include #include #include using namespace std;int main(){ int N; while (scanf("%d", &N) != EOF) { int sum = 0; int k;// k代表是第k条线. for (int原创 2013-02-02 17:37:34 · 504 阅读 · 0 评论 -
字母重排
这道还是不错的一道题目,主要是涉及的知识点就是排序模版的运用,在一个就是用内存来解决多重运用的问题;诶呀呀 还是多做点题目好一点,主要是自己可以多学习思想,如果只是停留在看上面,你是学不会的,其实聪明的人,大有所在,而我真不算聪明的,所以自己只能使用记呀,背呀,还有就是写来弥补了!#include #include #include #include using names原创 2013-02-02 14:16:45 · 828 阅读 · 0 评论 -
6174黑洞问题
6174问题是个黑洞问题.因为所有的4位数,做了正排序,做了逆排序,最终都会到6174问题而结束循环,,,这说明了数学的有趣其实做过一次这个题目,不过忘了是哪一题了贴出现在的代码:#include #include #include #include using namespace std;char str[111];int num[1111];int g原创 2013-02-02 13:27:04 · 1669 阅读 · 0 评论 -
判断一个点是不是在三角形里面
现在学了这个知识点还真是不错哈,,很满足呀, 虽然学了很长时间才弄懂,,不过弄懂就不错呀,,呵呵还是高中的知识给力哈,,,判断一个点是不是在三角形内部,分两种做法.当然第一种就是如果点在每条直线的同一侧,那就证明了在三角形的内部,反之,则不在.第二种呢,也很简单就是判断,三角形的面积,是不是以此点为顶点而构成的三角形面积之和...如果相等,那说明在三角形内部,如果不相等,那就不是在原创 2013-02-03 22:20:56 · 965 阅读 · 0 评论 -
素因数分解
素因数又写,,, 很好看呀呵呵贴出代码:#include #include #include #include #include using namespace std;int main(){ int N; while (cin >> N) { int temp = N; cout << N << "="; int cnt = 0; int转载 2013-02-03 19:52:31 · 794 阅读 · 0 评论 -
循环法-求大数相乘
这个思想既简单,又实用真心不错,!就是那种简便运算其实,把一个数字拆分成各位,十位,百位等等,然后就可以确定结果到底在哪一位上了,进位的时候就可以按照超出10 没有超出10 来计算了!贴出代码:没有写好呀...#include #include #include #include using namespace std;char str_a[1111];c原创 2013-02-01 12:43:35 · 677 阅读 · 0 评论 -
5.1.5(大数阶乘)
诶呀呀,,其实很久以前就是看过别人写的大数阶乘了的,,但是,今天写起来还是想了半天还是没有写出来呀看了看书,才豁然开朗..诶哟哟,这次一定要掌握了,这都多长时间了 如果还是没有掌握的话,那真的就是自己没有用心学..呜呜贴出代码:#include #include #include #include using namespace std;const int maxn =原创 2013-01-29 10:36:07 · 567 阅读 · 0 评论 -
5.1.4小学生算术
这个其实就是一个简单的大数相加问题,以前也写过,不过现在我还是写出来了,嘿嘿.还是不错的 就是不知道 写的完善不完善,因为也没有什么可以让我提交的网站,悲催哈..贴出代码:#include #include #include #include using namespace std;int main(){ char s1[22], s2[22]; s1[0] =转载 2013-01-29 09:47:16 · 593 阅读 · 0 评论 -
多少块地(求可以分成多少个独立的区域)
这个欧拉公式 我记得初中,高中都学过,但是老师给略过了,,我清楚的记得,,呵呵欧拉公式和欧拉函数可不一样,欧拉公式也分很多种呢,,,但是关于立体平面的一个是最为有趣的,虽然是推论出来的,,但是也很好用哈...诶诶诶,,家里面的事真的很烦呀..呜呜...我要平静,,我要看书,,我要将自己变得平静....贴出代码:需要记住的都在代码里面:#include #include原创 2013-02-04 19:24:20 · 719 阅读 · 0 评论 -
7.1.1除法
诶哟喂...诶诶诶,,上午去陪爸爸妈妈赶集去了,,呜呜呜,,好冷的好冷的,,今天又下雪啦..天天下雪呀,,我喜欢下雪,但是,,那是小时候的事了,,现在长大了,,又觉得没什么意思了,这几天每天都按时睡觉,睡觉前一定会看一个小时的沉思录,,呼呼.我是发现了,,不仅是我,任何一个人,学习环境的重要性对他的影响是不言而喻的.家人都在,小孩子哭闹,小广广来我家找我玩,小康康 来找我玩..我还原创 2013-02-05 22:05:27 · 645 阅读 · 0 评论 -
7.1.2(最大乘积)
这个暴力法,还是比较好的不,但是一般在 比赛的过程中是遇不到的,,不可能就是这种纯暴力的想法,但是也许就是个水题的话,自己还是可以做出来的不呵呵,,还是不错的哈;;;贴出代码:#include #include #include #include using namespace std;int a[22];int max[22];int main(){ i原创 2013-02-05 22:29:35 · 801 阅读 · 0 评论 -
7.4.1八皇后问题(经典回溯法)
这真是不错的算法,主要是运用的思想真是让人称奇呢,用数组的维数来分别表示列数,主对角线,副对角线上是否又Queue真是棒,,,学习了,学习了贴出代码:/*主要的精华就是那个vis函数包含的东西太多了,发现二维函数其实可以干很多东西的.真的是很神奇的,用vis[1][i] 代表的是第cur行的第i列是否已经存在着Queue了,而vis[2][cur + i]就是来判断是不是主对角原创 2013-03-05 20:01:45 · 1703 阅读 · 0 评论 -
7.5.2倒水问题(BFS)
这个绝对是个好的题目,我太喜欢了,.,,真棒呢~!这就是体现出来了编程对于生活的影响了,,你看吧,用生活中的思想用程序实现出来,,解决任何问题,,这也许就是最初发明计算机的初衷,就是解决那些费力费时的问题的!!!贴出代码:#include #include #include #include #include #define min(a , b) (a) < (b原创 2013-03-05 21:50:31 · 3860 阅读 · 0 评论 -
5.1.3(求最小循环节)
就是一个暴力求最小循环节的题目,还是比较简单的吧.贴出代码:#include #include #include #include using namespace std;int main(){ char str[111]; while (scanf("%s", str) != EOF) {// system("pause"); int n = strlen原创 2013-03-04 21:20:55 · 824 阅读 · 0 评论 -
7.3.2(子集生成1)
学到了那个用标记的方法生成所有的子集,主要的方法就是把所有的元素都先标记上,然后再一个一个的标记,反标记,然后再把元素一起输出来,方法比较好.也比较容易上手,就是一个递归的小程序;主要的是那个对应映射的关系;代码:#include #include #include #include using namespace std;int n;int A[1111原创 2013-02-06 22:02:08 · 636 阅读 · 0 评论 -
7.2.1(按照字典序全排列)
诶诶诶,,,又忘了全排列的模版函数了,,,晕死了..忘了存到哪里去了,,呜呜,,下次一定存到博客上面来.,..不对呀...我记得存进来了呀??需要注意的地方我都标记了#include #include #include #include using namespace std;const int maxn = 11111;int n;int a[maxn];v原创 2013-02-06 20:27:26 · 745 阅读 · 0 评论 -
7.3.3(状态压缩求子集生成)
用到的是状态压缩,一直想学状态压缩的..姥姥滴.老是学不会.这次是懂了百分之80%知道了为什么用&了...是这样的,把你要生成子集的数,按照a0 a1 a2 a30 0 0 0 // 状态栏1 3 5 6 // 数组拦出现1的时候就输出对应的书阻拦的数就可以了.爱情保卫战,怎么那么搞笑- -#贴出代码:#inc原创 2013-02-07 21:53:35 · 624 阅读 · 0 评论