自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 zoj 2326 Tangled in Cables

复习kruskal算法,外带字符串的二分,qsort的使用,并查集的基本应用。#include #include #include #include #define N 200 using namespace std; struct edge { int a,b; double dist; }e[N*N]; char h[N][25]; int set[N]; int cmp(const void *a,const void *b) { edge *p1=(edge *)

2011-04-13 13:20:00 478

原创 线段树小结

本来想写些文字,最后还是觉得线段树标记太灵活了,直接贴点模板算了http://blog.csdn.net/xiaomajiyue/archive/2011/03/04/6222924.aspxhttp://blog.csdn.net/xiaomajiyue/archive/2011/03/05/6225871.aspxhttp://blog.csdn.net/xiaomajiyue/archive/2011/04/12/6317156.aspxhttp://blog.csdn.net/xiaomajiyue

2011-04-12 14:40:00 356

原创 poj 2528 Mayor's posters

<br />线段树+离散化<br />线段树的更新操作相同于涂颜色那题,线段树的查询操作则比涂颜色那题简单,因为查询的是整条线段而不是某一段。<br />离散化说白了,就是一个排序+二分,也许我的理解还尚不成熟,等以后题目做多了再来讨论<br />#include<iostream> #include<cstdlib> #include<cstring> using namespace std; #define N 10005 struct node { int l,r,bj,c; }st

2011-04-12 09:06:00 69

原创 poj 2549 Sumsets

<br />hash应用。<br />a+b+c=d,各个值都是不等的,用四个循环肯定超时,所以把c移到右边,则变成两个两重循环。把数存于s[]数组中。因为这些数比较大,所以把取模作为hash函数,关键值就是abs(s[i]+s[j])%N,并把i与j存于res数组中,hash表中存放的是res数组的下标。判断成立的条件:h=res[ptr->index].i<br />       k=res[ptr->index].j<br />       s[h]+s[k]==s[i]-s[j]&&i!=h&&

2011-04-07 21:25:00 619

原创 poj 1971 Parallelogram Counting

<br />这题本想用hash,从MLE变到 RE,最后停留在 TLE,关键值就是中点坐标的和,用链表来解决关键值相同的情况(碰撞);最后猥琐的排序过了。<br />#include<iostream> using namespace std; #include<cstdlib> struct Point { int x,y; }; Point p[1005],mp[500005]; int cmp(const void *a,const void *b) { Point *p1=(

2011-04-07 19:09:00 608

原创 hash 小结

<br />hash思想:将某个对象对应到一个关键值,然后根据关键值归类,将该对象的数组下标放在哈希表中,以后查找时,可以通过关键值实现高效查找。不同的对象可能对应相同的关键值,通过链表解决碰撞。<br />推荐的题目:poj1840 poj2002<br />贴一下模板(poj2002)<br />struct Point { int x,y; }; Point p[1005]; struct Hash { int index; Hash *next; }; Hash *ys[N

2011-04-06 22:26:00 401

原创 poj 1080 Human Gene Functions

<br />dp[i][j]记录a的前i个字符 与 b的前j个字符进行匹配得到的最大值。dp[i][j] 由dp[i-1][j],<br />dp[i][j-1],dp[i-1][j-1]三种情况得来。第一种情况:a的前i-1个字符与b的前j个字符匹配得到的最大值,再加上a[i]与‘-’的匹配情况;第二第三种情况类似。<br />果然是LCS的思想<br /><br />

2011-04-06 12:43:00 340

原创 LCS && LIS

<br />LIS的子问题:dp[i]记录以a[i]为终点的最长上升子序列的长度<br />dp[1]=1; for(i=2;i<=n;i++) { temp=0; for(j=1;j<i;j++) if(a[i]>a[j]&&dp[j]>temp) temp=dp[j]; dp[i]=temp+1; }<br /> <br />LCS的子问题:dp[i][j]记录以i结尾的s1与以j结尾的s2的最长公共子序列的长度<br />n1=strlen(s1+1); n2=s

2011-04-06 09:56:00 441

原创 poj 1159 Palindrome

<br />拿到这题前,知道是最长公共子序列。看了之后,发现,只要求一下原串与反串的最长公共子序列就可以了。自己也讲不出个所以然,discuss里讲的挺好的<br />http://poj.org/showmessage?message_id=95237<br /><br /><br /><br />

2011-04-06 08:52:00 336

原创 poj 3176 Cow Bowling

数塔问题,最最简单的DP了吧#include #define N 355 int a[N][N],dp[N][N]; int mymax(int c,int d) { return c>d?c:d; } int main() { int n,i,j; scanf("%d",&n); for(i=1;i=1;i--) for(j=1;j

2011-04-04 21:07:00 324

原创 poj 1976 A Mini Locomotive

<br />b[i]=a[i]+a[i+1]+......a[i+m-1];<br />dp[i][j]表示用j个火车头装前i个b,最后输出dp[n-m+1][3];<br />则b[i]装或者不装,不装则dp[i-1][j],装则dp[i-m][j-1]+b[i];<br />#include<iostream> #define N 50005 using namespace std; int dp[N][4],sum[N],a[N]; int mymax(int c,int d) { re

2011-04-04 19:47:00 653

原创 poj 1260 Pearls

<br />dp[i]记录到i为止的最小花费,对于第i个种类,也许1~i都用策略i,或者2~i用策略i。。。。k~i用策略i(k>=1&&k<i),换句话说,就是前k个知道最小花费,k+1~i用策略i,<br />dp[k]+(sum[i]-sum[k]+10)*p[i](k>=0&&k<i);<br />#include<iostream> #define N 105 #define inf 1000000000 using namespace std; int p[N],dp[N],sum[N]

2011-04-04 12:27:00 386

原创 poj 1836 Alignment

<br />好不容易想到从左往右求一次LIS,再从右往左求一次LIS,然后就不断wa,看了discuss,才知道并不是总是相邻的相加<br />#include<iostream> using namespace std; #define N 1005 double p[N]; int lef[N],rig[N]; int main() { int n,i,temp,j; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%lf",p+i);

2011-04-03 19:52:00 298

原创 poj 1837 Balance

dp[i][j]记录前i个砝码平衡度为j的方法数。假如已经知道了前i个砝码所有的平衡度的方法数,则就可以求出前i+1个砝码的所有平衡度的方法数,dp[i][j+p[k]*w[i]+4000]+=dp[i-1][j+4000],最后的答案是dp[n][4000];#include using namespace std; #define N 8000 int dp[25][N],w[25],p[25]; int main() { int c,g,i,j,k; scanf("%d%d",&c,

2011-04-03 14:24:00 264

原创 poj 3267 The Cow Lexicon

<br />用dp[i]记录msg中从0到i的最少要删除的字符数。每扫描一个字符s[i],dp[i]最多为<br />dp[i-1]+1,然后对于每一个单词,从i往前找,如果找到,min{dp[j]+i-j-len[k],dp[i]}<br />如果没有找到,还是dp[i]。<br />#include<iostream> #include<cstring> using namespace std; char w[605][30],s[305]; int dp[305],len[605]; int

2011-04-03 14:12:00 300

原创 并查集算法小结

<br />并查集的题目还是比较明显的。<br />一类是并查集的基本应用,用到了基本的合并与查找,hdu1198 1811 poj2524 1611<br />另一类是以“食物链”为代表的并查集的高级应用,用到了相对关系,路径压缩时相对关系的递归变化,poj1182 1703 2492 1988<br />贴上最基本的并查集模板:<br />int find(int x) { int r=x,i,j; while(r!=set[r]) r=set[r];

2011-04-01 22:43:00 1633

原创 hdu 1811 Rank of Tetris

<br />并查集的题目,再加个拓扑排序。<br />一开始总是wa,我那个犯2的错误:用gets读入,却忽略了如果那些数字大于9的情况。<br />#include<iostream> #include<queue> using namespace std; #define N 10005 #define M 20005 struct edge { int ver; edge *next; }; queue<int>que; edge *g[N]; int deg[N],se

2011-04-01 20:43:00 651

原创 hdu 1829 A Bug's Life

<br />过了几个月,再来做这题,以前在poj做过。<br />属于同一个集合的生物,则关系确定。而这些关系都是相对于根节点的。rank[x]=0,代表set[x]与x同性,rank[x]=1代表set[x]与x异性。<br />若x,y属于同一个集合,若rank[x]==rank[y]则报错,若rank[x]!=rank[y]则不处理<br />若x,y不属于同一个集合,则合并两个集合,只要修改set[ry],rank[ry];<br />在每次的查找过程中,递归的修改x到rx路径上的点的set和ran

2011-04-01 14:42:00 1108 1

原创 hdu 1198 Farm Irrigation

<br />网上说是并查集的题目,bfs就过了,不过其中也有并查集的感觉。每次以一个点为起点搜索,搜到的都属于一个集合,用了几次bfs,就是有几个集合。<br />#include<iostream> #include<queue> using namespace std; int g[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0}, {0,1,0,1},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0}

2011-04-01 14:33:00 393

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除