- 博客(28)
- 资源 (13)
- 收藏
- 关注
原创 Bridging signals 如果f(i)只和i-1有关系 可以使用两个一维数组 交替循环
<br />#include<stdio.h>#include<string.h>int a[2][40002];int n;int b[40002];int DP(){ int x=1; int i; for(i=0;i<=n;i++) a[0][i]=0; while(x<=n){ int k,kk; k=x%2;kk=(x+1)%2; for(i=1;i<b[x];i++) a[k][i]=a[kk][i]; f
2010-08-30 17:10:00 484
原创 Common Subsequence 动态规划 不难 但是犯了个错误刚开始 没用标记数组 直接使用a判断 是否为零 结果是测试数据有很多key为零 超时
<br />#include<stdio.h>#include<string.h>int a[512][512];bool sign[512][512];char b[512],c[512];int DP(int x,int y){ if(x<0||y<0)return 0; if(sign[x][y])return a[x][y]; int max;int temp; max=DP(x-1,y); temp=DP(x,y-1); if(temp>m
2010-08-30 15:44:00 489
原创 Arithmetically Challenged 排列树 子集树 24点问题 回溯 关联容器
#include#include#includeusing namespace std;set s;int a[20];int kkk;void backtrack1(int k);void backtrack2(int k);void swap(int &x,int &y);bool ff(int i,int k,int j); void swap(int &x,int &y){ int temp; temp=x; x=y; y=temp;
2010-08-25 11:31:00 613
原创 错排公式
递推的方法推导错排公式 当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推. 第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法; 第二步,放编号为k的元素,这时有两种情况.1,把它放到位置n,那么,对于剩下的n-2个元素,就有M(n-2)种方法;2,不把它放到位置n,这时,对于这n-1个元素,有M(n-1)种方法; 综上得到 M(n)=(n-1)[M(n
2010-08-23 16:24:00 468
原创 string对象与数值转换 串流操作 stringstream学习
#include#include#include#includeusing namespace std;string tostring(double x)//int输出地挺好的但是还you使用double可能输出科学型{ ostringstream o; if(o>x)return x;}int main(){ char b[10]={NULL}; string a; int c=58; double d=c;
2010-08-23 16:04:00 1269
原创 hku2585 hotel
<br />#include<stdio.h>#include<string>bool pipei(bool c[52][52],char a[52],char b[52],int m,int n){ if(c[m][n]==true)return false; if(m==0) { if(a[m]=='*')return true; else if(a[m]=='?'&&n==0)return true; else if(n==0&&a[m]==b[n])r
2010-08-22 17:22:00 431
原创 强连通分量
1. Kosaraju算法(双DFS)2.Tarjan算法 3.Gabow一.Kosaraju算法算法的核心实现是,首先DFS一遍,得到一个DFS森林,在此过程中得到所有点的拓扑序列(按结束时间由高到低),之后我们建一个反向图,按反拓扑序(结束时间由高到低)进行第二次DFS,则此时得到的每一棵树都是一个强连通分量,这个画个图演示一下比较好理解,严格证明还是参考算法导论340页较好,感性的认识是,假定我们有C1,C2两个强连通分量,而在反拓扑序中C1是在C2前面的,此时说明G中第一遍DFS
2010-08-21 10:30:00 479
原创 序列容器
vector1.以类似于普通数组的方式存储类型为 T 的对象,只是它的容量可以根据需要存储的对象个数进行调整。2.使用下标运算符[]可以像数组那样访问vector容器中的元素。3.vector容器的大小是其中元素的个数--调用size()来获得容器的大小; vector容器的容量是当前它可以包含的最大元素个数--调用capacity()来获得容器的大小。 (在创建特定容量的vector对象时,其大小和容量是相同的) 如:std::vector a(10) (如果给
2010-08-20 18:56:00 925
原创 平衡二叉树
平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
2010-08-20 15:40:00 894
原创 Message Flood 字典树 小心memset的使用
#include#include#include#includeusing namespace std;int tr[200000][27];int num;int tri(char temp[11]){ int i=0;int loc=0; while (i
2010-08-20 13:33:00 417
原创 Virtual Friends 字典树 并查集
<br />#include<stdio.h>#include<string.h>int fnum[200001];//父节点里面存放本集合内的元素个数int bing[200001];//并查集使用int tri[10000][53];//字典树int tnum=0;int find(int k){ if(bing[k]!=k) bing[k]=find(bing[k]); return bing[k];}void cinn(char temp[21])
2010-08-19 07:09:00 430
原创 logo 注意使用三角函数
#include//假设起点为00原点#include#includeusing namespace std;double startx,starty;//当前开始坐标double fx,fy;//方向double distance;//距离double pi=acos(-1);void move(double &startx,double &starty,double fx,double fy,int d)//求前进后的坐标{ startx+=d*fx
2010-08-18 16:59:00 701
原创 poj1423 tmd公式
<br />#include<stdio.h>#include<math.h> int stirling(int n);int main(){ int k; int n; scanf("%d",&k); while(k--) { scanf("%d",&n); printf("%d/n",stirling(n)); } return 0;}int stirling(int n){ doub
2010-08-17 17:49:00 394
原创 poj 1129 Channel Allocation
<br />#include<stdio.h>#include<string.h>int a[27];//存放i的取值1-26bool b[27];//i是否是新数值,还是从i前面找到的bool arce[27][27];//初始化为真临近为false不临近trueint n;int num=0;int min=26;void init();int DFS(int k);int main(){ while(scanf("%d",&n)==1)
2010-08-16 08:47:00 404
原创 poj 2676 Sudoku 破水题废了我一天时间 其实一点含量都没有 郁闷。。。想多了。。。
<br />#include<stdio.h>#include<string.h>int a[10][10];bool sign[10][10];//标jibool ssign;//标记是否已经得到结果 bool isign[10][10];//第i行中1-9是否已经填入bool jsign[10][10];//第j列中1-9是否已经填入bool ijsign[4][4][10];//小方块中1-9是否已经填入int N=9;void init();int iDFS(
2010-08-14 16:24:00 552
原创 poj 3278 Catch That Cow 广度优先搜索 + 回溯 队列 剪枝
#include#include#includeusing namespace std; int num;int sign=100000;//当kk>k的时候剪枝int n,k;bool c[100001];//记录是否已经使用过vector test[2];//队列交替vector::iterator t;int DFS();int main(){ scanf("%d%d",&n,&k); if(n>=k){printf("%d",n-k);retu
2010-08-13 15:21:00 669
原创 poj1321棋盘问题
<br />#include<stdio.h>bool arce[9][9];bool isign[9];bool jsign[9];int num;int n,k,kk;void init();bool DFS(int h);int A(int k);int main(){ while(scanf("%d%d",&n,&k)) { if(n==-1&&k==-1)break; int c=0;int i; init(); for(i=
2010-08-13 11:07:00 523
原创 poj3099 Go Go Gorelians 建图 DFS 回溯
<br />#include<stdio.h>#include "math.h"int e[2001][2];//边[0],to.[1]next;int a[1001][5];//点[0],ID,[1]next;2x3y4zint c[1001];int cnum;int max;int m;bool sign[1001];int n;//点的数目int en;//边的数目void initt();void init();int DFS(int s);in
2010-08-12 20:01:00 1023
原创 poj2488 回溯 注意字典 边缘的处理思想
#includebool a[30][30];//标志char way[678][2];//路径int k;int p,q;bool f(int x,int y);void init();int main(){ int n; scanf("%d",&n); int i=1; while(i
2010-08-12 13:21:00 539
原创 poj1050To the Max 枚举的程序 严重超时 wa 浪费了大量时间,但分配数组的时候学到了点东东
<br />#include <stdio.h>char a[5050][5050];bool c[5050][5050]={false};int b[100][100];int n;int to(int x1,int x2);int sum(int x1,int x2,int y1,int y2);int init();int f(int x1,int x2,int y1,int y2);int main(){ init(); printf("%d/n",f
2010-08-11 16:14:00 1200
原创 poj1050To the Max 动态规划 +分治 +矩阵压缩 经典
#includeint a[100][100];int n;int max1(int c[100]);int sumij(int i,int j);int init();int max2();int main(){ init(); printf("%d/n",max2()); return 0;}int max2(){ int i; int j; int summax=0; for(i=n-1;i>=0;i--) for(j=i;
2010-08-11 16:10:00 501
原创 poj2503Babelfish字典树
<br />#include<stdio.h>int str[200000][27];//数组大小?char strr[100000][11];//存放字符串char temp[11];char t[11];int init();int p(char * a);int main(){ init(); while(1) { p(temp); if(scanf("%s",temp)!=1)break; } return 0;
2010-08-11 13:03:00 511
原创 poj1088滑雪
<br />动态规划+最小堆排序 最小堆空间的分配 判断句的嵌套 和&&注意了 <br />#include<stdio.h>int a[101][101];int b[101][101];int dui[10001][3]; int x,y;int r,c;int sizenum=0;int dele();void adjust(int i);void insert(int a1,int a2,int a3);int f(int n);int main()
2010-08-10 18:52:00 821
原创 poj3356AGTC
<br />多case 动态规划 备忘录 scanf返回值<br />#include<stdio.h>char a[1001];char b[1001];int c[1001][1001];int f(int x,int y);int main(){ int A,B; int i,j; while(scanf("%d",&A)!=EOF){ for(i=0;i<=A;i++)scanf("%c",&a[i]); scanf("%d",&B); for(i=0
2010-08-10 15:31:00 377
原创 poj 2533Longest Ordered Subsequence
<br />#include<stdio.h>int f(int i);int A[1000+1];int B[1000+1]; int main(){ int k; k=1; int temp=k; while(k--) { int n; int max=0; scanf("%d",&n); int i; for(i=1;i<=n;i++)scanf("%d",&A[i]),B[i]=0; f(n);
2010-08-10 10:59:00 390
原创 poj1511 Invitation Cards Dijkstra+最小堆(heap)
<br /> Dijkstra+最小堆(heap) #include<stdio.h>#define MAX 1000000#define MAXX 1000000000struct edge{int to;long long val;int next;}e[MAX+1],re[MAX+1];int vex[MAX+1];int rvex[MAX+1];int final[MAX+1];long long D[MAX+1];long long dui
2010-08-07 11:16:00 600
原创 ACM POJ 3463 Sightseeing
题目大意:求源点S到终点T的最短路的数量和比最短路长1的数量。解题思路:我们可以利用dijstra算法的思想,只需在其中进行一些改进即可。可以先定义一个二维的数组dist[N][2]。dist[i][0]代表源点S到点i的最短路,dist[i][1]代表源点S到点i的次短路。初始化dist[S][0]=0,其余的都初始化为无穷大。然后定义一个二维数组waynum[N][2]记录路径方法数,waynum[S][0]=1,其余初始为0。再定义一个标记数组vis[N][2],初始vis[S][0]被标记已访问,其
2010-08-05 16:15:00 2096 3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人