国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

HDU1560 DNA sequence IDA* + 強(qiáng)力剪枝 [kuangbin帶你飛]專題二

2019-11-08 02:51:10
字體:
供稿:網(wǎng)友

        題意:給定一些DNA序列,求一個最短序列能夠包含所有序列。

      思路:記錄第i個序列已經(jīng)被匹配的長度p[i],以及第i序列的原始長度len[i]。則有兩個剪枝:

剪枝1:直接取最長待匹配長度。1900ms

int h = 0;for(int i = 0; i < n; ++i) {    h = max(len[i] - p[i], h); //最大待匹配長度 }剪枝二:統(tǒng)計(jì)每個序列里面四種序列值,并求得每種序列值的最長長度。將四種序列值加起來就是最長待匹配長度。180ms

int cal() { //至少還需要匹配的長度 	memset(cost, 0, sizeof(cost));	memset(tp, 0, sizeof(tp));	for(int i = 0; i < n; ++i) {		for(int j = p[i]; j < len[i]; ++j) tp[ha[str[i][j]]]++;		for(int j = 0; j < 4; ++j) {			cost[j] = max(cost[j], tp[j]);			tp[j] = 0;		}	}	int h = 0;	for(int i = 0; i < 4; ++i) h += cost[i];	return h; }剪枝二優(yōu)于剪枝一。

AC代碼:180ms

#include<cstdio>#include<cstring>#include<algorithm>#include<map>using namespace std;map<char, int>ha; const int maxn = 10;char str[maxn][maxn];int len[maxn], p[maxn];int n, maxd, pd;int cost[4], tp[4];char ch[] = {'A', 'G', 'C', 'T'};int cal() { //至少還需要匹配的長度 	memset(cost, 0, sizeof(cost));	memset(tp, 0, sizeof(tp));	for(int i = 0; i < n; ++i) {		for(int j = p[i]; j < len[i]; ++j) tp[ha[str[i][j]]]++;		for(int j = 0; j < 4; ++j) {			cost[j] = max(cost[j], tp[j]);			tp[j] = 0;		}	}	int h = 0;	for(int i = 0; i < 4; ++i) h += cost[i];	return h; }int dfs(int cnt) {	int h = cal();	if(h == 0) {		PRintf("%d/n", maxd);		return 1;	}	if(h + cnt > maxd) {		pd = min(h + cnt, pd);		return 0;	}	int old[maxn];	memcpy(old, p, sizeof(old));	for(int i = 0; i < 4; ++i) {		char c = ch[i];		int flag = 0;		for(int j = 0; j < n; ++j) {			if(p[j] < len[j] && str[j][p[j]] == c) {				flag = 1;				++p[j];			}		}		if(flag && dfs(cnt + 1)) return 1;		memcpy(p, old, sizeof(old));	}	return 0; }int main() {	for(int i = 0; i < 4; ++i) ha[ch[i]] = i;	int T;	scanf("%d", &T);	while(T--) {		maxd = 0;		memset(p, 0, sizeof(p));		scanf("%d", &n);		for(int i = 0; i < n; ++i) {			scanf("%s", str[i]);			len[i] = strlen(str[i]);			maxd = max(maxd, len[i]);		}		while(1) {			pd = 1 << 30;			if(dfs(0)) break;			maxd = pd;		}	}	return 0;}如有不當(dāng)之處歡迎指出!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东港市| 哈巴河县| 离岛区| 达孜县| 邢台县| 南江县| 任丘市| 大化| 天长市| 寻甸| 于田县| 泽州县| 江华| 达日县| 晋中市| 定安县| 泸溪县| 绥中县| 虹口区| 潜江市| 措勤县| 孟州市| 呼伦贝尔市| 宁南县| 界首市| 潮安县| 和静县| 呼玛县| 武汉市| 南宁市| 金堂县| 张家界市| 濮阳市| 垣曲县| 浑源县| 桃源县| 宕昌县| 鹤壁市| 图木舒克市| 清流县| 丹阳市|