摘要: 这题有两种解题思路,一个是记忆化搜索,一个是dp。分别贴代码:记忆化搜索:#include#include#include#include#includechar str[1000],a[300],b[300];int sum,flag;int hash[205][205];void dfs(int i,int j,int k){ if(flag) return ; if(k==sum) { flag=1; return ; } if(hash[i][j]) return ; hash[i][j]=1;... 阅读全文
posted @ 2013-07-08 14:59 fangguo 阅读(323) 评论(0) 推荐(0) 编辑
摘要: 从原串的最大长度开始枚举,当某个长度的值能保存所有串时,即成功。对每个长度进行深搜,每次取某个串的第一个。#include#include#include#include#includeusing namespace std;char str[8][6];int flag=0,len[10],n;int getlen(int *a){ int i,ans=0; for(i=0;inowlen)//剩下的串中最短的串比预计长度要长 return ; if(nowlen==0)//找到,进行标记 { flag=1; return ;... 阅读全文
posted @ 2013-07-08 11:10 fangguo 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 这题我们可以用优先队列,每次弹出队列中操作次数最少的一个,那么当找到匹配数时,该值一定是最优的。需要注意的时,加个vi[]数组,判读当前数是否已经存在于队列中。我做的很烦啊~~~#include#include#include#include#include#includeusing namespace std;int n,m;int vi[100000];struct Point{ int n,num; Point(int x,int y) { vi[x]=1; n=x; num=y; } int operator te... 阅读全文
posted @ 2013-07-07 15:28 fangguo 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 这题一开始把我给坑了,我还没知道LCIS的算法,然后就慢慢搞吧,幸运的是还真写出来了,只不过麻烦了一点。我是将该题转换为多条线段相交,然后找出最多多少条不相交,并且其数值死递增的。代码如下:#include#include#include#includeusing namespace std;int dp[510][510];int list1[510],list2[510];struct Edge{ int val,vex[510]; int pos;}p[510];void init(){ int i,j; for(i=0;ip[j].val) ... 阅读全文
posted @ 2013-07-06 19:06 fangguo 阅读(172) 评论(0) 推荐(1) 编辑
摘要: 由于next[i]保存的是前i-1个字符中最大的重复子序列,那么i-next[i]就是循环节。#include#include#includeusing namespace std;int next[1000100];void getnext(char *str){ int j,k; memset(next,0,sizeof(next)); j=0; k=-1; next[0]=-1; while(str[j]) { if(k==-1 || str[j]==str[k]) next[++j]=++k; ... 阅读全文
posted @ 2013-07-05 17:39 fangguo 阅读(109) 评论(0) 推荐(0) 编辑
摘要: #include#include#includeusing namespace std;int next[10010];void getNext(char *str){int j,k;memset(next,0,sizeof(next));j=0;k=-1;next[0]=-1;while(str[j]){if(k==-1 || str[j]==str[k])next[++j]=++k;elsek=next[k];}}int KMP(char *s,char *t){ getNext(t); int i,j,k; i=j=0; int num=0; while(s... 阅读全文
posted @ 2013-07-05 15:09 fangguo 阅读(136) 评论(0) 推荐(0) 编辑
摘要: #include#include#include#includeint vi[102][102][102];using namespace std;struct Point{ int a,b,c,v; Point(int x,int y,int z,int vv){a=x,b=y,c=z,v=vv;}};void pu(int &a,int &b,int c){ if(b==c) return ; if(a+b q; Point p(0,0,c,0); q.push(p); int s=c,n=a,m=b; while(!q.emp... 阅读全文
posted @ 2013-07-05 06:20 fangguo 阅读(170) 评论(0) 推荐(0) 编辑
摘要: #include#include#includeusing namespace std;int map[7][7];int num[7][7];char H[6];int ff=0;int n=1;void dfs(int x,int y){ int i,j; if(x==6) { ff=1; cout<<n++<<endl; for(i=0;i<=5;i++) { for(j=0;j<=5;j++) { printf("%c",H[map[i][j]]); ... 阅读全文
posted @ 2013-07-01 20:24 fangguo 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 题目:脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子。它由4种主要的脱氧核苷酸(dAMP、dGMP、dCMT和dTMP)通过磷酸二酯键连接而成。这4种核苷酸可以分别记为:A、G、C、T。 DNA携带的遗传信息可以用形如:AGGTCGACTCCA.... 的串来表示。DNA在转录复制的过程中可能会发生随机的偏差,这才最终造就了生物的多样性。 为了简化问题,我们假设,DNA在复制的时候可能出现的偏差是(理论上,对每个碱基被复制时,都可能出现偏差): 1. 漏掉某个脱氧核苷酸。例如把 AGGT 复制成为:AGT 2. 错码,例如把 AGGT 复制成了:AGCT 3. 重码,例如把 AG. 阅读全文
posted @ 2013-07-01 19:24 fangguo 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 这题的思想很简单,就是每次找出队列里面花费时间最少的来走下一步,这样当我们找到k点后,所花费的时间一定是最少的。但要用一个标记数组vis[200010],用来标记是否走过。否则会内存溢出。#include<queue>#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int vis[200010];struct Point{ int position,Time; Point(int a,int b) { position=a;Time=b; vis[a 阅读全文
posted @ 2013-06-21 13:41 fangguo 阅读(264) 评论(0) 推荐(0) 编辑