【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1

非常简单的DP

如果dp[i,j]表示从0到i 和 从0到j 这两段的相似度,

那么可以知道每个dp[i,j]是由三种状态转化过来的

第一种 当dna1[i]==dna2[j]的时候

dp[i-1,j-1] +  1  长度加1

第二种  否则 从下面两个状态过来那就是

dp[i][j-1] 和 dp[i-1][j]//注意因为是顺序遍历 这两个都已经计算过

取两者最大即可。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

//最长公共子序列长度 LCS dp

char dna1[1000+10];
char dna2[1000+10];
int len1 , len2;

int dp[1000+10][1000+10];
//表示dna1 从第1位到i 和 dna2 从第一位到j的 相似度

void init(){
    cin>>dna1;
    cin>>dna2;
    len1 = strlen(dna1);
    len2 = strlen(dna2);
}

int build(){
    memset(dp,0,sizeof(dp));
    for (int i = 1; i <= len1; ++i){
        for (int j= 1; j <= len2; ++j){
            bool ok = (dna1[i-1]==dna2[j-1]);
            dp[i][j]= max(
                dp[i-1][j-1] + ok,
                max(
                dp[i-1][j],
                dp[i][j-1]
                )
                );

        }
    }
    return dp[len1][len2];
}

int main(int argc, char const *argv[])
{
    init();
    cout<<build()<<endl;
    return 0;
}
时间: 2024-10-03 04:12:58

【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1的相关文章

【算法学习笔记】40.树状数组 动态规划 SJTU OJ 1289 扑克牌分组

Description cxt的扑克牌越来越先进了,这回牌面的点数还可以是负数, 这回cxt准备给扑克牌分组,他打算将所有的牌分成若干个堆,每堆的牌面总和和都要大于零.由于扑克牌是按顺序排列的,所以一堆牌在原牌堆里面必须是连续的.请帮助cxt计算一下,存在多少种不同的分牌的方案.由于答案可能很大,只要输出答案除以1,000,000,009的余数即可. Input Format 第一行:单个整数:N,1 ≤ N ≤ 10^6 第二行到N + 1行:在第i + 1行有一个整数:Ai, 表示第i张牌牌

【算法学习笔记】55.DFS 记忆化搜索 SJTU OJ 1063 小M爱滑雪

Description 小M超级喜欢滑雪~~ 滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当小M滑到坡底,便不得不再次走上坡或者等待升降机来载你.小M想知道滑雪场中最长底的滑坡.滑雪场由一个二维数组给出.数组的每个数字代表点距离水平面的相对距离.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 小M可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子中,一条可滑行的

【算法学习笔记】35.高精度 竖式乘法 SJTU OJ 1274

Description 输入a,b 输出a*b的竖式乘法,格式见样例. Sample Input1 11 9 Sample Output1 11 9 -- 99 Sample Input2 10 10 Sample Output2 10 10 --- 100 Sample Input3 101 101 Sample Output3 101 101 ----- 101 101 ----- 10201 Sample Input4 10086 2 Sample Output4 2 10086 ----

【算法学习笔记】39.字符串处理 单词分割 SJTU OJ 1302 缩进格式

1302. 缩进格式 Description 小z想和小y愉快的玩耍,但是小y在写程序.程序写好了,但是小y怎么调试也过不了.小z帮小y看了一下就不想看了,因为小y虽然是萌妹子,但是她的程序缩进实在是不忍直视.于是小z决定帮她纠正. 程序里的每一行语句分为单词和空格,ASCII码从33到126的一段连续字符串是单词,而单词之间由ASCII码为32的空格分开.小z的缩进方法具体来说是这样:对于每一行的第 i 个单词,它的第一个字符的位置不能小于其它每一行的第 1 至第 i−1 个单词,且每个单词的

【算法学习笔记】42.正反DP 填充连续 SJTU OJ 1285 时晴时雨

1285. 时晴时雨 Description Taring 喜欢晴天,也喜欢雨天. Taring说:我想体验连续的K天的晴朗,去远足,去放歌:我还想再这K个晴天之后,再去体验连续的K天的云雨,去感受落雨时的轻语.这是令Taring最开心的事情了.其它的时间,Taring会在机房默默的编写着代码. 当然,Taring不想在这连续的K个晴天和连续的K个雨天里被机房的事务打扰或者被自然天气的变化中断.也就是说,这K个晴天和K个雨天必须是连续的,但是他们之间并不需要时间连续.显然的,Taring如果在感

【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks

我们发现这个题里每一种“移动套餐”用的次数只有0,1,2,3 是有效的,4和0是一样的. 所以我们开一个数组rot[10]来记录这9个套餐分别用了多少次. 字典序的处理和我们的枚举顺序息息相关. 我们从 000000000 到 333333333 来枚举的话,第一个符合条件的结果当然就是所有答案中字典序最小的一个了. 枚举这个排列我们需要用9个for,当然也可以用递归来实现,不过我还是喜欢视觉感比较强烈的9个for.... 在每一种排列下,我们需要通过这些套餐的方案来计算临时结果path. 然后

【算法学习笔记】44. 并查集补充 SJTU OJ 3015 露子的星空

[题目描述] 已经深夜了,露子仍然在公园里仰望星空.你走近后,她对你说:“呜—,你看夜空中的星星.它们本来都是孤独地毫无联系,但人们赋予了它们各种地联想,在它们之间连上了线,便形成了夜空中无数的星座.”你回答:“是啊.为什么我们不自己创造一个美丽的星空呢?” 假设夜空中一共有n颗星星,它们初始时都没有连线.接下来,露子会给你m条指令.一共有以下三种指令: 1.在某两颗星星间连线.(可能会重复连接两颗星星) 2.询问你当前夜空中一共有多少个星座. 3.某两颗星星当前是否属于同一个星座. 其中星座是

【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们

这个题很多地方暗示了DP的路径. 我们处理时,dp[i][j]可以认为是从i坐标到j坐标的序列达到回文效果需要的最小代价,以此向外扩展,最终得到dp[0][M-1]就是结果. 我们要注意到处理dp[i][j]时,我们需要知道 dp(i+1,j-1)的结果,所以i必须降序,j必须升序,才能保证在计算dp(i,j)时,可以利用已经计算过的结果. 所以 i应该从M-2 到 0 递减 j在内层 从i+1到M-1 递增 在处理dp(i,j)时,第一要看name[i]和name[j]是否相等,如果相等的话,

由LCS到编辑距离—动态规划入门—算法学习笔记

一切计算机问题,解决方法可以归结为两类:分治和封装.分治是减层,封装是加层. 动态规划问题同样可以用这种思路,分治. 它可以划分为多个子问题解决,那这样是不是用简单的递归就完成了?也许是的,但是这样会涉及太多的不便的操作.因为子问题有重叠! 针对这种子问题有重叠的情况的解决,就是提高效率的关键. 所以动态规划问题可以总结为:最优子结构和重叠子问题. 解决这个子问题的方式的关键就是:memoization,备忘录. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方