摘要:转自:http://www.wutianqi.com/?p=596最近更新:2011.4.31.鉴于文章图片和排版的问题,对文章进行了重新编辑。2.看见网上很多朋友在转载时不尊重别人的劳动成果,任意删除文章里关于作者的信息,希望大家在转载时保留文章所有信息,遵守版权规定。前段时间写了一篇《背包之01背包、完全背包、多重背包详解》,看到支持的人很多,我不是大牛,只是一个和大家一样学习的人,写这些文章的目的只是为了一是希望让大家学的轻松,二是让自己复习起来更方便。(以下内容部分引至杭电ACM课件和维基百科)在数学中,某个序列的母函数是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母
阅读全文
摘要:这是一道整数划分的题目,用到的算法思想是母函数,当然还有其他的比如递推,DP可以用来解决这道题,关于母函数的思想可以参考http://www.wutianqi.com/?p=596/** Author:lonelycatcher* problem:hdu 1028* Type: 母函数,拆分数,整数划分*/#include<stdio.h>#include<string.h>#include<cstdlib>#include <iostream>using namespace std;int N;__int64 c1[125];__int64 c
阅读全文
摘要:这是一道排列的题目,北大的程序设计书里面有这道题,讲的挺细的,可以去看看,两种方法/** Author:lonelycatcher* Problem:HDU 1027* Type:全排列*///方法一:/*#include<stdio.h>#include<string.h>#include<cstdlib>#include<algorithm>using namespace std;int n,m;int sequence[1010];int main(){setbuf(stdout,NULL);int i,j,k;while(scanf(&q
阅读全文
摘要:哎~~花了半天的时间写了一个DFS的程序,结果无情的limit time exceed,然后到网上搜了一下,居然用的是BFS一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(比如3步就必须达到条件)"的问题,它的空间效率高,但是找到的不一定是最优解,必须记录并完成整个搜索,故一般情况下,深搜需要非常高效的剪枝(优化).像搜索最短路径这些的很明显要是用广搜,因为广搜的特性就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的应用,像什么最少状态转换也是可以应
阅读全文
摘要:参考:http://www.cnblogs.com/lonelycatcher/archive/2011/07/28/2119123.html//最长递增自序列,吉林大学模板#include<iostream>#include<stdio.h>#include<cstdlib>#include<string.h>using namespace std;int N,ans;int a[500010];int f[500010];int d[500010];//d[i]表示以结尾的最长递增子序列长度,当然,这道题中,数组d可以用不到的int bsea
阅读全文
摘要:以下文章转载自CSDN,我收藏一下。因为找不到原作作者,敬请原谅,如果您是作者请告知我。最长递增子序列问题的求解最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能够锻炼设计较复杂算法的思维,我对这个问题进行了较深入的分析思考,得出了几种复杂度不同算法,并给出了分析和证明。一,最长递增子序列问题的描述设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其
阅读全文
摘要:传送们:http://blog.sina.com.cn/s/blog_677a3eb30100jxqa.htmlAuthorJGShining(极光炫影)思路:dp[i][j]表示前j个元素分成i段的最优解,同时这个最优解是由a[j]元素结束的。转移方程是dp[i][j]=max{f[i][j-1]+a[j],f[i-1][k]+a[j],(i-1<=k<j)} (i<=j<=n-m+i)其中j的上下界的确定比较麻烦。现在分别解释上界和下界:上界:dp[i][j]中,如果j=i-1,意思就是在前面i-1个元素中分成i段,这个是不可能实现的。下界:如果m=n=4,这时dp
阅读全文
摘要:参见《组合数学》第八章 特殊计数序列 P185,因为涉及到大数,所以用java 处理起来比较方便import java.util.*;import java.io.*;import java.math.*;public class Main { public static void main(String[] args) { BigInteger []h=new BigInteger[101]; h[0]=new BigInteger("1"); h[1]=new BigInteger("1"); for(int i=2;i<=100;i++) {
阅读全文
摘要:#include <iostream>#include<stack>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<string>using namespace std;int N;string come;string leave;int order[50];int main(){ setbuf(stdout,NULL); stack<char>s; while(cin>>N) { cin>>come; cin&
阅读全文
摘要:#include<stdio.h>#include<cstdlib>#include <iostream>using namespace std;int GCD(int x,int y){ if(!x || !y)return x>y?x:y; for(int t;t=x%y;x=y,y=t); return y;}int LCM(int x,int y){ int gcd=GCD(x,y); return x/gcd*y;}int ans;int main(){ setbuf(stdout,NULL); int T,number,i,inter; s
阅读全文
摘要:#include<stdio.h>#include<string.h>#include <iostream>using namespace std;int N;int prime[12]={2,3,5,7,11,13,17,19,23,29,31,37};int ring[25];int visited[25];int search(int low ,int high,int x){ if(low>high)return 0; int mid=(low+high)>>1; if(x==prime[mid])return mid; else
阅读全文
摘要:这道数学题用到了数论中的一个公式,叫做斯特林公式,lnN!=NlnN-N+0.5*ln(2*N*pi)//============================================================================// Name : HDU.cpp// Author : lonelycatcher// Version :// Copyright : Your copyright notice// Description : Hello World in C++, Ansi-style//================================
阅读全文
摘要:题意很简单,就是求一定范围内子矩阵的和,数据量很大,用暴力的话一定会超时,这道题用二维的树状数组做比较简单。。。#include<stdio.h>#include<string.h>#include <iostream>using namespace std;#define MAX 1030int tree[MAX][MAX];int S,ans;int lowbit(int x){return x&(-x);}void add(int x,int y,int num){ for(int i=x;i<=S;i+=lowbit(i)) { for
阅读全文
摘要:题意很简单,需要注意的一点是当两头牛的range完全相同的时候后面的牛的Strongnumber==前面牛的Strongnumber,效率不是很高,2200+ms#include<stdio.h>#include<algorithm>#include<string.h>#include <iostream>using namespace std;typedef struct{ int x; int y; int index;}cow;cow cows[100010];int N;int tree[100010];int ans[100010];b
阅读全文
摘要:STL 中 sort 函数用法简介 转自http://blog.csdn.net/rattles/article/details/5510919 做 ACM 题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的 O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。 STL 里面有个 sort 函数,可以直接对数组排序,复杂度为 n*log2(n) 。使用这个函数,需要包含头文件。 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是 [a,b) 。简单来说,有一个数组 int a[10
阅读全文
摘要:#include <iostream>#include<stdio.h>#include<string.h>using namespace std;int N;int x,y;int tree[33000];int level[16000];int lowbit(int t){return t&(-t);}void update(int index){ while(index<33000) { tree[index]++; index+=lowbit(index); }}int getSum(int index){ int sum=0; whi
阅读全文
摘要:1) 数据结构(一): 线段树,树状数组,二维线段树2) 动态规划:状态压缩,树形动归,平行四边形法则3) 数据结构(二): DFA, Trie树,Trie图等4) 搜索:深搜,广搜,剪枝,IDA*算法5) 若干图论问题:强连通分量、桥和割点等6) 计算几何:线与线求交,线与面求交,求凸包,半平面求交等7) 网络流算法:基本的网络流算法,Dinic算法,带上下界的网络流,最小费用流8) 数学题:组合数学,数论等
阅读全文
摘要:与其说这是一道搜索题,倒不如说是一道枚举题更加合适,反正就是纯暴力。。。。注意读懂题意#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<string>#include<algorithm>using namespace std;char s[12];int cmp(const void*a ,const void*b){ return *(int*)b-*(int*)a;}__int64 target;int main
阅读全文
摘要:这是一道关于迷宫的搜索题,注意看懂题意:必须在time=T的时候门才开,这个时候必须准时到达door才能survive,既不能早了,也不能晚了,有一个细节用到了奇偶剪枝原理#include<iostream>#include<cstdio>#include<cmath>#include<string.h>using namespace std;int N,M,T,OK;int startx,starty,endx,endy;char maze[8][8];int mark[8][8];int X[4]={1,-1,0,0};int Y[4]={0
阅读全文
摘要:典型的活动安排问题,先将活动按照结束时间进行排序。。。。#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;int N;struct show{ int start; int end;};show shows[110];int cmp(const void* a,const void* b){ show c=*(show*)a; show d=*(show*)b; if(c.end==d.end) { return c.start-d.start; } else ret
阅读全文
摘要:贪心+排序#include <iostream>#include<stdio.h>#include<algorithm>#include<math.h>using namespace std;int M,N;struct wareroom{ int Javabean; int catfood; double balance;};wareroom room[100000];int cmp(const void* a,const void* b){ wareroom c=*(wareroom*)a; wareroom d=*(wareroom*)b;
阅读全文
摘要:上一页 | 返回目录 | 下一页最接近点对问题 转自参考解答 这个问题很容易理解,似乎也不难解决。我们只要将每一点与其他n-1个点的距离算出,找出达到最小距离的两个点即可。然而,这样做效率太低,需要O(n2)的计算时间。在问题的计算复杂性中我们可以看到,该问题的计算时间下界为Ω(nlogn)。这个下界引导我们去找问题的一个θ(nlogn)算法。 这个问题显然满足分治法的第一个和第二个适用条件,我们考虑将所给的平面上n个点的集合S分成2个子集S1和S2,每个子集中约有n/2个点,·然后在每个子集中递归地求其最接近的点对。在这里,一个关键的问题是如何实现分治法中的合并步骤,即由S1和S2
阅读全文
摘要:一道数学题,纠结了好长时间,10^8 的话,用O(N)的算法一定会超时,考虑到模7,是一个循环问题,重要的是找出循环节,注意不一定是从f[1]出开始循环。。。#include<iostream>#include<cstdio>using namespace std;int f[100];int A,B;long long N;int find(int left,int right){ for(int i=1;i<left;i++) { if(f[i]==f[left]&&f[i+1]==f[right])return i; } return 0;}
阅读全文
摘要:水题,用map爽过~#include <iostream>#include<string>#include<map>#include<cstdio>using namespace std;int N;int main(){ int i; map<string,int> ball; while(scanf("%d",&N)!=EOF) { if(!N)break; ball.clear(); string color,popularcolor; for(i=1;i<=N;i++) { cin>&g
阅读全文
摘要:来源:(http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html) - C++map的基本操作和使用_Live_新浪博客 Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!1.map最基本的构造函数; map<string , int >mapstring; map<int ,string >mapint; map<sring, char>mapstring; map< char ,string>mapcha
阅读全文
摘要:Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可能轻易描述,很明显学号用int描述,姓名用字符串描述(本篇文章中不用ch
阅读全文
摘要:这是一道典型 的动态规划的题目,意思是让求一段序列中连续子序列的最大和,并输出起始位置和终止位置//============================================================================// Name : HDU.cpp// Author : sunyanfei// Version :// Copyright : Your copyright notice// Description : Hello World in C++, Ansi-style//=======================================
阅读全文