动态规划,和LCS有点近似,但是我用递归加结果记录解掉了,感觉这样更直观 -_____- (其实是类LCS解法的那个一开始就没去考虑....... 面壁一下
)
dp方程见代码,应该写的比较利索了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INFINITE -9999
#define MINUS 4
int score_board[5][5] = { { 5, -1, -2, -1, -3},
{-1, 5, -3, -2, -4},
{-2, -3, 5, -2, -2},
{-1, -2, -2, 5, -1},
{-3, -4, -2, -1, INFINITE}};
int score(int* gen_seq1, int len1, int* gen_seq2, int len2);
void init_memory(int gen1, int gen2);
int max(int a, int b, int c);
int* integer_array(char* gen, int len);
int memory[120][120];
int main(int argc, char** argv) {
int case_count;
char gen1[121], gen2[121];
int len1, len2;
freopen("in.txt", "r", stdin);
scanf("%d", &case_count);
while(case_count --) {
scanf("%d%s%d%s", &len1, gen1, &len2, gen2);
init_memory(len1, len2);
printf("%d\n", score(integer_array(gen1, len1), len1,
integer_array(gen2, len2), len2));
}
return 0;
}
int max(int a, int b, int c) {
return a < b ? max(b, c, a) : (a > c ? a : c);
}
void init_memory(int len1, int len2) {
int i, j;
for(i = 0; i <= len1; i ++) {
for(j = 0; j <= len2; j ++) {
memory[i][j] = INFINITE;
}
}
memory[0][0] = 0;
}
int* integer_array(char* gen, int len) {
int* array = (int*)malloc(sizeof(int)*len);
int i;
for(i = 0; i < len; i ++) {
switch(gen[i]) {
case 'A': array[i] = 0; break;
case 'C': array[i] = 1; break;
case 'G': array[i] = 2; break;
case 'T': array[i] = 3; break;
}
}
return array;
}
int score(int* gen1, int len1, int* gen2, int len2) {
int max_score = 0, i;
if(memory[len1][len2] != INFINITE) return memory[len1][len2];
if(len1 > 0 && len2 > 0) {
max_score = max(
score(gen1 + 1, len1 - 1, gen2 + 1, len2 - 1) + score_board[gen1[0]][gen2[0]],
score(gen1, len1, gen2 + 1, len2 - 1) + score_board[MINUS][gen2[0]],
score(gen1 + 1, len1 - 1, gen2, len2) + score_board[gen1[0]][MINUS]
);
} else if (len1 == 0 && len2 > 0) {
for(i = 0; i < len2; i ++) {
max_score += score_board[MINUS][gen2[i]];
}
} else if (len2 == 0 && len1 > 0) {
for(i = 0; i < len1; i ++) {
max_score += score_board[gen1[i]][MINUS];
}
}
memory[len1][len2] = max_score;
return max_score;
}
分享到:
相关推荐
这个问题可以通过容斥原理或者中国剩余定理来解决,但在这里采用了一种简单的动态规划思路。 **解法:** 对于每个蒸笼的包子数 A[i],我们可以检查所有可能的组合,判断是否存在一种组合使得组合的包子数等于某个...
读书笔记:点灯游戏简单开发和解题图片(类似httpszhuanlan.zhihu.comp21265602)
### 动态规划(Dynamic Programming)详解:算法优化之道 #### 引言 动态规划(Dynamic Programming,简称 DP)作为一种高效的问题求解方法,在多个领域内广泛应用,包括但不限于数学、管理科学、计算机科学、经济...
动态规划(Dynamic Programming,简称DP)是一种高效求解复杂问题的方法,它通过将原问题分解成较为简单的子问题来求解。这种方法广泛应用于数学、管理科学、计算机科学、经济学以及生物信息学等领域。 动态规划的...
其实 很多考研的小伙伴们都在数学笔记上纠结过 或者 正在纠结着 究其原因 简单来说就是“性价比”的问题 一方面 奋斗在第一线的同学们都知道一个完整全面的数学笔记将会大大提高后期复习的效率(其实不仅仅如此 ...
刷题笔记记录是代码随想录提供的一个功能,用于记录用户在刷题过程中的解题思路和方法。它可以帮助用户更好地理解和掌握题目解法,加深对算法和数据结构的理解。 ## 如何使用刷题笔记记录 使用刷题笔记记录非常...
常见的算法类型包括排序(如快速排序、归并排序、冒泡排序等)、搜索(如二分查找、深度优先搜索、广度优先搜索)、图论算法(如Dijkstra算法、Floyd算法、最小生成树算法)以及动态规划等。LeetCode中的题目往往...
本压缩包中的“高等数学(本)笔记串讲”提供了对该课程的重要概念、定理和方法的详细解释和综合梳理,旨在帮助学生深化理解并提高解题能力。 笔记串讲首先会从微积分的基本概念入手,包括极限、导数、不定积分和定...
【中考状元笔记_数学(236页).pdf】是一份详实的中考数学复习资料,共计236页,由历年中考状元精心整理而成,旨在帮助考生掌握关键的数学概念、公式和解题技巧,以提升中考数学成绩。这份笔记涵盖了初中数学的重要...
笔记的核心内容很可能是围绕算法这一主题展开的,包括但不限于排序、搜索、图论、动态规划、贪心策略、回溯等经典算法。在Java编程方面,可能会介绍如何用Java语言高效地实现这些算法,以及Java编程的基础知识、面向...
5. **随机过程**:虽然考研数一对随机过程的要求不如对其他部分深,但笔记可能也会提及简单随机过程,如马尔可夫链,以及随机过程的一些基本概念。 6. **极限定理**:除了大数定律,笔记可能还会涉及切比雪夫不等式...
6. 动态规划、贪心策略等算法设计思想的介绍。 这份笔记不仅提供了理论知识,还可能包含练习题和解题思路,帮助学习者巩固和提高数据结构能力。对于希望提升编程技能或准备相关考试的人来说,严蔚敏的《数据结构》...
笔记时,先概括每段的大意,然后根据逻辑关系进行连接,可以画出简单的流程图或关系图,以提高解题速度。 接下来是英译汉,考生需要将一篇约400词的英文段落翻译成汉语。在做笔记时,先通读全文,理解大意,然后...
8. **动态规划与贪心算法**:在解决某些特定问题时,动态规划和贪心策略可以简化问题的解决过程,如背包问题、最短路径问题等。 9. **递归与分治**:递归是解决复杂问题的有效工具,而分治策略则是设计高效算法的...
其实 很多考研的小伙伴们都在数学笔记上纠结过 或者 正在纠结着 究其原因 简单来说就是“性价比”的问题 一方面 奋斗在第一线的同学们都知道一个完整全面的数学笔记将会大大提高后期复习的效率(其实不仅仅如此 ...
根据给定的信息,“物理高考状元笔记 必修2”这一标题和描述暗示了这份资料主要聚焦于高中物理必修课程中的第二部分,并且是针对中国高考备考的学生所编写的高质量学习资料。通常这类资料会涵盖重要的概念、公式、...
课堂笔记则会记录老师在教学过程中的重点讲解和解题策略,可能包括典型例题的解析、解题步骤的详述、易错点的提醒以及一些实战策略,帮助学生巩固和深化理解。 通过这些讲义和笔记,学生们可以系统性地复习和练习YM...
这份笔记深入浅出地涵盖了微积分的基本概念、理论和应用,旨在帮助考生扎实基础,提升解题能力,顺利通过考试。在本文中,我们将详细探讨微积分在考研中的重要性,以及它所包含的关键知识点。 微积分是高等数学的...
5. **使用简单语言**:要点写作应注重语言的准确性和完整性,避免语法错误,使用简单明了的句子而非孤立的词语。 ### 结论 掌握这些听力解题技巧,不仅能够帮助考生在六级听力考试中取得优异成绩,还能提升英语...