复制上一题总结

caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽

   (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符 

   (2)初始化问题。
         一般设f[i][j]为第一个字符前i个,第二个字符前j个的最优价值

         f[0][0] = 0

          然后要初始化f[i][0], f[0][i]


      这个时候要根据题意。

         这个时候就是一个字符有,一个字符空的情况

   (3)然后就可以两层for了
          这个时候记住根据题目有不同的决策,取最优

          一般有匹配字符和不匹配字符(如加空格)两种情况


          按照题目而定  

          最后要注意如果是取min初值要最大,max初值最小

          或者直接用其中一个决策作为初值

依然是套模型

初始化的话显然空字符就是全是'-'

然后依然是匹配字符或者是选'-'

爽!!!!

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 112;
char a[MAXN], b[MAXN];
int f[MAXN][MAXN], lena, lenb; int d[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, 0 }; int ID(char x)
{
if(x == 'A') return 0;
if(x == 'C') return 1;
if(x == 'G') return 2;
if(x == 'T') return 3;
if(x == '-') return 4;
}
int dist(char x, char y) { return d[ID(x)][ID(y)]; } int main()
{
scanf("%d%s%d%s", &lena, a + 1, &lenb, b + 1);
f[0][0] = 0;
REP(i, 1, lena + 1) f[i][0] = f[i-1][0] + dist(a[i], '-');
REP(i, 1, lenb + 1) f[0][i] = f[0][i-1] + dist(b[i], '-'); REP(i, 1, lena + 1)
REP(j, 1, lenb + 1)
{
f[i][j] = f[i-1][j-1] + dist(a[i], b[j]);
f[i][j] = max(f[i][j], max(f[i-1][j] + dist(a[i], '-'), f[i][j-1] + dist(b[j], '-')));
}
printf("%d\n", f[lena][lenb]); return 0;
}

caioj 1071 动态规划入门(二维一边推4:相似基因) (最长公共子序列拓展)的更多相关文章

  1. caioj 1069 动态规划入门(二维一边推2:顺序对齐)(最长公共子序列拓展总结)

    caioj 1068是最长公共子序列裸体,秒过, 就不写博客了 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽    (1) 字符串下标从1开始,因为0用来表示 ...

  2. caioj 1070 动态规划入门(二维一边推3:字符距离)(最长公共子序列拓展)

    复制上一题总结 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽    (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符     (2) ...

  3. caioj 1073 动态规划入门(三维一边推:最长公共子序列加强版(三串LCS))

    三维的与二维大同小异,看代码. #include<cstdio> #include<cstring> #include<algorithm> #define REP ...

  4. caioj 1063 动态规划入门(一维一边推1:美元和马克)

    这道题一开始我是这么想的 最后的答案肯定是某次的马克换回来的,但这个该怎么确定?? 实际上应该把范围缩小,只看最后一次和倒数第二次之间有什么联系. 可以发现,只有两种可能,最后一天换或者不换.换的话就 ...

  5. caioj 1067动态规划入门(一维一边推5: 乘积最大(高精度版))

    因为这里涉及到乘号的个数,那么我们可以用f[i][j]表示前i个位乘号为j个时的最大乘积 那么相比上一题就是多了一层枚举多少个乘号的循环,可以得出 f[i][r] = max(f[j - 1][r - ...

  6. caioj 1066 动态规划入门(一维一边推4:护卫队)(分组型dp总结)

    很容易想到f[i]为前i项的最优价值,但是我一直在纠结如果重量满了该怎么办. 正解有点枚举的味道. 就是枚举当前这辆车与这辆车以前的组合一组,在能组的里面取最优的. 然后要记得初始化,因为有min,所 ...

  7. caioj 1065 动态规划入门(一维一边推3:合唱队形)

    就是最长上升子序列,但是要用n^2的算法. #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int ...

  8. C++动态规划实现查找最长公共子序列

    问题描述: 给定两个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列.(给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共 ...

  9. 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance

    引言 二维动态规划中最常见的是棋盘型二维动态规划. 即 func(i, j) 往往只和 func(i-1, j-1), func(i-1, j) 以及 func(i, j-1) 有关 这种情况下,时间 ...

随机推荐

  1. HDU 1175 连连看【BFS】

    题意:给出起点和终点的棋子,不能经过别的棋子,而且转弯的次数不能超过2次,问能否消除 和逃离迷宫一样,每个节点记录下来它的当前的方向和转弯的次数,再搜 注意特判起点的棋子和终点的棋子为0或者不一样的情 ...

  2. SpringCloud学习笔记(14)----Spring Cloud Netflix之Hystrix对Feign的支持

    1. Hystrix对Feign的支持 添加Feign中IUserBiz的实现类HystrixFallBack: package com.wangx.cloud.springcloud02consum ...

  3. 结构化数据、半结构化数据、非结构化数据——Hadoop处理非结构化数据

    刚开始接触Hadoop ,指南中说Hadoop处理非结构化数据,学习数据库的时候,老师总提结构化数据,就是一张二维表,那非结构化数据是什么呢?难道是文本那样的文件?经过上网搜索,感觉这个帖子不错 网址 ...

  4. layui层级

    zIndex:layer.zIndex, success : function(layero){ var zIndex = layer.index; $(layero).css(‘z-index’,z ...

  5. selenium自动化(一).........................................搭建环境

    一  环境搭建 安装python(建议使用py3) py2和py3在语法上会有一定的差别 第三方插件逐步转向py3,很多py2的插件已经停止维护 本教程的所有代码基于py3 安装selenium插件 ...

  6. 浏览器 滚动条 占据 y轴宽度的解决方案

    html { overflow-y: scroll; } :root { overflow-y: auto; overflow-x: hidden; } :root body { position: ...

  7. HDU-2087 剪花布条 字符串问题 KMP算法 查匹配子串

    题目链接:https://cn.vjudge.net/problem/HDU-2087 题意 中文题咯 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条, ...

  8. 51nod 1325 两棵树的问题(最大权闭合子图)

    首先如果点权全都为正,就可以直接选所有的点. 活在梦里.. 考虑枚举一个点\(i\),作为我们选择的集合中的一个点. 然后我们把另一个点\(j\)选入集合的时候必须把两棵树中\(i\)和\(j\)路径 ...

  9. 如何在ssh远程linux服务器时不需要输入密码

    目的: 期望A服务器在对B服务器执行ssh或者scp等命令的时候不需要输入密码 实现方法: 1.通过安装sshpass服务 2.通过密钥验证的方式 操作过程: 一.通过sshpass的方式达到密码非交 ...

  10. 微信小程序 分享海报

    const app = getApp(); const template = require('../../template/templates.js'); Page({ /** * 页面的初始数据 ...