poj 1699 搜索(AGCT组成最短串,题目有BUG)
2014-08-16 17:13
417 查看
题意:给定若干个DNA(由AGCT组成)串,求一个能够包含所有给定串的长串的最小长度。比如包含如下五个串:‘TCGG', 'GCAG', 'CCGC', 'GATC' 和 'ATCG的结果是CCGCAGATCGG。
思路:先用一个数组over[i][j]记录第i个串在第j个串前面时的最大重复字符数。然后搜索串的不同排列方式(相当与对不同串的前后进行全排列),求出不同方式的最短总串长度即可。
但是,怎么做都会WA,看了discuss知道错误出现在串有包含情况的数据中。但是题目并没有说不允许串的包含,不明所以。比如两个串“CC”和“ACCA”,按照题意应该“ACCA”就符合的嘛,但是这组数据偏偏要输出6,也就是求over[i][j]的时候,i不能包含j,也就是当第i个串的长度(leni)大于等于第j个串的长度(lenj)时,第i个串需要从第leni-lenj+1的位置开始匹配。这有点诡异吧!
思路:先用一个数组over[i][j]记录第i个串在第j个串前面时的最大重复字符数。然后搜索串的不同排列方式(相当与对不同串的前后进行全排列),求出不同方式的最短总串长度即可。
但是,怎么做都会WA,看了discuss知道错误出现在串有包含情况的数据中。但是题目并没有说不允许串的包含,不明所以。比如两个串“CC”和“ACCA”,按照题意应该“ACCA”就符合的嘛,但是这组数据偏偏要输出6,也就是求over[i][j]的时候,i不能包含j,也就是当第i个串的长度(leni)大于等于第j个串的长度(lenj)时,第i个串需要从第leni-lenj+1的位置开始匹配。这有点诡异吧!
#include <stdio.h> #include <string.h> #define min(a,b) ((a)<(b)?(a):(b)) #define N 15 #define M 25 #define INF 0x3fffffff char s [M]; int over ,seq ,visited ; int n,m,T,res,sumlen; int test_overlap(int i,int j){ char a[M],b[M]; int lena,lenb,flag; strcpy(a,s[i]); strcpy(b,s[j]); lena = strlen(a); lenb = strlen(b); if(lena> lenb)//按照我之前的做法i直接赋值为0 i = lena-lenb+1; else i = 0; for(;i<lena;i++){ for(j = flag = 0;j<lenb&&j+i<lena;j++) if(a[i+j] != b[j]){ flag = 1; break; } if(!flag) return j; } return 0; } void dfs(int depth){ int i,temp; if(depth == n){ for(i = temp = 0;i<n-1;i++) temp += over[seq[i]][seq[i+1]]; res = min(res,sumlen-temp);//一次排列的结果,所有字符的综合减去这种排列一共消掉的字符数 return; } for(i = 0;i<n;i++) if(!visited[i]){ seq[depth] = i;//seq保存全排列的数字 visited[i] = 1; dfs(depth+1); visited[i] = 0; } } int main(){ freopen("a.txt","r",stdin); scanf("%d",&T); while(T--){ int i,j,k; res = INF; memset(visited,0,sizeof(visited)); scanf("%d",&n); for(i = sumlen = 0;i<n;i++){ scanf("%s",s[i]); sumlen += strlen(s[i]); } for(i = 0;i<n;i++) for(j = 0;j<n;j++) if(i != j) over[i][j] = test_overlap(i,j); dfs(0); printf("%d\n",res); } return 0; }
相关文章推荐
- poj 搜索题目
- Poj 1383 Labyrinth( 搜索获得全局最短路径 )
- 每日一搜——poj搜索题目分类
- [置顶] poj搜索训练题目题解
- 《挑战程序设计比赛》 P35 题目:迷宫的最短路径 广度搜索
- POJ搜索题目总结
- poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
- [省选前题目整理][POJ 2069]Super Star(爬山搜索)
- POJ题目分类(搜索)
- poj 搜索题目列表
- poj搜索题目
- UVA529加深迭代搜索,起点为1,终点为n,数列中的每个数由前面俩个数的和组成的最短数列
- POJ 搜索题目分类
- POJ搜索题目
- poj 1847 最短路径基础题目
- POJ 题目1579 Function Run Fun(记忆搜索)
- 搜索最短路径:迷宫问题 POJ - 3984
- POJ 2112:二分搜索 + 二分图多重匹配 + 最短路径
- poj上搜索经典题目
- 【POJ1699】-Best Sequence 搜索剪枝