`
azure_sky
  • 浏览: 12598 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

解题笔记 之 1027 简单动态规划

阅读更多

动态规划,和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;
}

 

 

分享到:
评论

相关推荐

    蓝桥杯练习系统试题解题笔记1

    这个问题可以通过容斥原理或者中国剩余定理来解决,但在这里采用了一种简单的动态规划思路。 **解法:** 对于每个蒸笼的包子数 A[i],我们可以检查所有可能的组合,判断是否存在一种组合使得组合的包子数等于某个...

    代码随想录+刷题笔记记录

    刷题笔记记录是代码随想录提供的一个功能,用于记录用户在刷题过程中的解题思路和方法。它可以帮助用户更好地理解和掌握题目解法,加深对算法和数据结构的理解。 ## 如何使用刷题笔记记录 使用刷题笔记记录非常...

    读书笔记:点灯游戏简单开发和解题图片(类似httpszhuanlan.zhihu.comp21265602).zip

    读书笔记:点灯游戏简单开发和解题图片(类似httpszhuanlan.zhihu.comp21265602)

    动态规划(Dynamic Programming)详解:算法优化之道

    ### 动态规划(Dynamic Programming)详解:算法优化之道 #### 引言 动态规划(Dynamic Programming,简称 DP)作为一种高效的问题求解方法,在多个领域内广泛应用,包括但不限于数学、管理科学、计算机科学、经济...

    2021年算法刷题笔记.pdf

    动态规划(Dynamic Programming,简称DP)是一种高效求解复杂问题的方法,它通过将原问题分解成较为简单的子问题来求解。这种方法广泛应用于数学、管理科学、计算机科学、经济学以及生物信息学等领域。 动态规划的...

    3.数学二高分学霸笔记.pdf

    其实 很多考研的小伙伴们都在数学笔记上纠结过 或者 正在纠结着 究其原因 简单来说就是“性价比”的问题 一方面 奋斗在第一线的同学们都知道一个完整全面的数学笔记将会大大提高后期复习的效率(其实不仅仅如此 ...

    英语口译笔记法实战指导

    笔记不是简单的文字记录,而是对讲话内容的提炼和再创造。有效的笔记技巧包括使用符号、缩写、箭头、连线等方法,来标示说话者的思路、强调数字和专有名词等关键信息。学习者通过系统训练,能够逐渐掌握如何在笔记中...

    labuladong的刷题笔记V5.0.pdf

    笔记中的动态规划部分,labuladong详细介绍了状态转移方程和备忘录等概念,并通过斐波那契数列、最长公共子序列等经典问题,讲解了动态规划的思想和解题步骤。掌握了这些方法之后,读者能解决诸如背包问题、编辑距离...

    Leetcode刷题笔记.zip

    常见的算法类型包括排序(如快速排序、归并排序、冒泡排序等)、搜索(如二分查找、深度优先搜索、广度优先搜索)、图论算法(如Dijkstra算法、Floyd算法、最小生成树算法)以及动态规划等。LeetCode中的题目往往...

    2009陈文灯考研数学笔记

    这些解析不仅仅是对答案的简单给出,而是深入剖析了每一道题目的考查点和解题思路,使考生在熟悉考试风格的同时,也能学习到如何运用所学知识解决实际问题。 学习《2009陈文灯考研数学笔记》时,建议考生们应当遵循...

    中考状元笔记_数学(236页).pdf

    【中考状元笔记_数学(236页).pdf】是一份详实的中考数学复习资料,共计236页,由历年中考状元精心整理而成,旨在帮助考生掌握关键的数学概念、公式和解题技巧,以提升中考数学成绩。这份笔记涵盖了初中数学的重要...

    labuladong刷题笔记 v5.x

    笔记的核心内容很可能是围绕算法这一主题展开的,包括但不限于排序、搜索、图论、动态规划、贪心策略、回溯等经典算法。在Java编程方面,可能会介绍如何用Java语言高效地实现这些算法,以及Java编程的基础知识、面向...

    考研数一概率论知识点(含例题、注释)手写笔记

    5. **随机过程**:虽然考研数一对随机过程的要求不如对其他部分深,但笔记可能也会提及简单随机过程,如马尔可夫链,以及随机过程的一些基本概念。 6. **极限定理**:除了大数定律,笔记可能还会涉及切比雪夫不等式...

    十一届蓝桥真题笔记(自己整理的)

    本篇笔记主要涉及的是编程题目解题策略,特别是针对蓝桥杯这种编程竞赛中的问题。题目要求找到输入日期的下一个回文日期和下一个ABABBABA型日期。这里主要涉及的编程知识点包括日期处理、回文数检测以及特定模式数字...

    对政治课堂教学做笔记的探索.doc

    关于笔记的内容,学生应有所选择地记录预习时的问题、未掌握的知识点、教师归纳的知识框架、课堂上产生的疑问以及解题思路等。同时,对于教材中没有的典型例题和解法,也应当详细记录。值得注意的是,应尽量避免重复...

    hdu题目分类

    - **解题思路**: 结合博弈论和状态压缩动态规划来解决问题。 15. **1017 TourGuide** - **知识点**: 图论、最短路径算法。 - **描述**: 寻找导游的最佳路线。 - **难度级别**: 中等。 - **解题思路**: 使用图...

    严蔚敏《数据结构》教学笔记

    6. 动态规划、贪心策略等算法设计思想的介绍。 这份笔记不仅提供了理论知识,还可能包含练习题和解题思路,帮助学习者巩固和提高数据结构能力。对于希望提升编程技能或准备相关考试的人来说,严蔚敏的《数据结构》...

    考研英语各大题型笔记方法.zip

    笔记时,先概括每段的大意,然后根据逻辑关系进行连接,可以画出简单的流程图或关系图,以提高解题速度。 接下来是英译汉,考生需要将一篇约400词的英文段落翻译成汉语。在做笔记时,先通读全文,理解大意,然后...

    2019天勤数据结构高分笔记

    8. **动态规划与贪心算法**:在解决某些特定问题时,动态规划和贪心策略可以简化问题的解决过程,如背包问题、最短路径问题等。 9. **递归与分治**:递归是解决复杂问题的有效工具,而分治策略则是设计高效算法的...

    2.数学一高分学霸笔记.pdf

    其实 很多考研的小伙伴们都在数学笔记上纠结过 或者 正在纠结着 究其原因 简单来说就是“性价比”的问题 一方面 奋斗在第一线的同学们都知道一个完整全面的数学笔记将会大大提高后期复习的效率(其实不仅仅如此 ...

Global site tag (gtag.js) - Google Analytics