动态规划,和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)是一种高效求解复杂问题的方法,它通过将原问题分解成较为简单的子问题来求解。这种方法广泛应用于数学、管理科学、计算机科学、经济学以及生物信息学等领域。 动态规划的...
其实 很多考研的小伙伴们都在数学笔记上纠结过 或者 正在纠结着 究其原因 简单来说就是“性价比”的问题 一方面 奋斗在第一线的同学们都知道一个完整全面的数学笔记将会大大提高后期复习的效率(其实不仅仅如此 ...
笔记不是简单的文字记录,而是对讲话内容的提炼和再创造。有效的笔记技巧包括使用符号、缩写、箭头、连线等方法,来标示说话者的思路、强调数字和专有名词等关键信息。学习者通过系统训练,能够逐渐掌握如何在笔记中...
笔记中的动态规划部分,labuladong详细介绍了状态转移方程和备忘录等概念,并通过斐波那契数列、最长公共子序列等经典问题,讲解了动态规划的思想和解题步骤。掌握了这些方法之后,读者能解决诸如背包问题、编辑距离...
常见的算法类型包括排序(如快速排序、归并排序、冒泡排序等)、搜索(如二分查找、深度优先搜索、广度优先搜索)、图论算法(如Dijkstra算法、Floyd算法、最小生成树算法)以及动态规划等。LeetCode中的题目往往...
这些解析不仅仅是对答案的简单给出,而是深入剖析了每一道题目的考查点和解题思路,使考生在熟悉考试风格的同时,也能学习到如何运用所学知识解决实际问题。 学习《2009陈文灯考研数学笔记》时,建议考生们应当遵循...
【中考状元笔记_数学(236页).pdf】是一份详实的中考数学复习资料,共计236页,由历年中考状元精心整理而成,旨在帮助考生掌握关键的数学概念、公式和解题技巧,以提升中考数学成绩。这份笔记涵盖了初中数学的重要...
笔记的核心内容很可能是围绕算法这一主题展开的,包括但不限于排序、搜索、图论、动态规划、贪心策略、回溯等经典算法。在Java编程方面,可能会介绍如何用Java语言高效地实现这些算法,以及Java编程的基础知识、面向...
5. **随机过程**:虽然考研数一对随机过程的要求不如对其他部分深,但笔记可能也会提及简单随机过程,如马尔可夫链,以及随机过程的一些基本概念。 6. **极限定理**:除了大数定律,笔记可能还会涉及切比雪夫不等式...
本篇笔记主要涉及的是编程题目解题策略,特别是针对蓝桥杯这种编程竞赛中的问题。题目要求找到输入日期的下一个回文日期和下一个ABABBABA型日期。这里主要涉及的编程知识点包括日期处理、回文数检测以及特定模式数字...
关于笔记的内容,学生应有所选择地记录预习时的问题、未掌握的知识点、教师归纳的知识框架、课堂上产生的疑问以及解题思路等。同时,对于教材中没有的典型例题和解法,也应当详细记录。值得注意的是,应尽量避免重复...
- **解题思路**: 结合博弈论和状态压缩动态规划来解决问题。 15. **1017 TourGuide** - **知识点**: 图论、最短路径算法。 - **描述**: 寻找导游的最佳路线。 - **难度级别**: 中等。 - **解题思路**: 使用图...
6. 动态规划、贪心策略等算法设计思想的介绍。 这份笔记不仅提供了理论知识,还可能包含练习题和解题思路,帮助学习者巩固和提高数据结构能力。对于希望提升编程技能或准备相关考试的人来说,严蔚敏的《数据结构》...
笔记时,先概括每段的大意,然后根据逻辑关系进行连接,可以画出简单的流程图或关系图,以提高解题速度。 接下来是英译汉,考生需要将一篇约400词的英文段落翻译成汉语。在做笔记时,先通读全文,理解大意,然后...
8. **动态规划与贪心算法**:在解决某些特定问题时,动态规划和贪心策略可以简化问题的解决过程,如背包问题、最短路径问题等。 9. **递归与分治**:递归是解决复杂问题的有效工具,而分治策略则是设计高效算法的...
其实 很多考研的小伙伴们都在数学笔记上纠结过 或者 正在纠结着 究其原因 简单来说就是“性价比”的问题 一方面 奋斗在第一线的同学们都知道一个完整全面的数学笔记将会大大提高后期复习的效率(其实不仅仅如此 ...