#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm> using namespace std;
/*dp,poj1080*/ int dp[][];//动态规划数据存放
int map[][];//用来存放原始数据 void map_init()
{
map['A']['A']=map['C']['C']=map['G']['G']=map['T']['T']=;
map['A']['C']=map['C']['A']=map['A']['T']=map['T']['A']=map['T'][' ']=map[' ']['T']=-;
map['A']['G']=map['G']['A']=map['C']['T']=map['T']['C']=map['G']['T']=map['T']['G']=map['G'][' ']=map[' ']['G']=-;
map['A'][' ']=map[' ']['A']=map['G']['C']=map['C']['G']=-;
map['C'][' ']=map[' ']['C']=-;
} int max_X3(int a,int b,int c)
{
if(a>b)
{
if(a>c)
return a;
else
return c;
}
else
{
if(b>c)
return b;
else
return c;
}
} int main()
{
int y;//全局次数
int i,j;//循环变量
int a,b;//用户输入
char str1[];
char str2[]; //初始化
map_init(); cin>>y;
while (y--)
{
scanf("%d %s",&a,str1);
scanf("%d %s",&b,str2); //初始化第一行第一列
dp[][]=;
for (i = ; i < a; i++)
dp[][i+] = dp[][i] + map[str1[i]][' ']; for (j = ; j < b; j++)
dp[j+][] = dp[j][] + map[str2[j]][' ']; for (i = ; i <= a; i++)
{
for (j = ; j <= b; j++)
{
dp[j][i] = max_X3(dp[j-][i-]+map[str2[j-]][str1[i-]],
dp[j-][i]+map[str2[j-]][' '],
dp[j][i-]+map[str1[i-]][' ']);
}
} cout<<dp[b][a]<<endl;
}
return ;
}

先上代码,然后说明。

首先对于动态规划到现在的理解,只是现阶段的理解。动态规划下面用dp代替。

要点:

1、一个问题可以被分成多个相同的子问题,子问题和原问题差别只有数据规模,总结就是大化小。

2、这个问题的解可以由子问题的解得出,总结就是用已经有的小解得出最后的解。

3、经常用一个二维数组去保存已经求出的解,之后要是用到就可以直接取不用计算,总结就是记录已经解过的方程的解,不做相同的无用功。

4、状态转移方程,其中的状态,初始值,这些都要考虑清楚。

对于模型,等我做过10道题目熟练之后再说吧,现在给出还为时过早。

题目:

首先明确状态,问问自己两个字符串对比有几种状态?下面用AB两个字符表示两个字符串

1、A的这个字母和B相同

2、A的这个字母和B不同,A和-对应

3、A的这个字母和B不同,B和-对应

最后出来的两个字符串一定是满足这个规则的。只有这三种状态。

那么状态转移方程呢?

1、明确目的,我们要求的是匹配的最后数字上面越大越好。

2、两个字母相同,那么是+5,其他都要减一个数,那么问题来了,这里千万不要以为相同就是最好的,如果这里认为相同就是最好的,那么你用的是贪心而不是dp了。

3、我们取之前的解为Y1,Y2,Y3,123对应上面三个状态,max(Y1+5,Y2-5,Y3-5)这里5是个虚数,可能是0也可能是负数。

4、要注意的有两点,第一,这个状态的之前那个状态的解,是不同的!如下面所示,如果我们处理第二个字符时候可能出现之前的情况就有下面三种

ATGC

GGGG

ATGC

-GGGG

-ATGC

GGGG

第二,Y1,Y2,Y3,是不同的,所以要取这三个值得max。

那么初始值呢?

初始值一般是二维数组的0行0列,这里要注意的是,这里的初始值不全是0,看看下面的情况

ATGC - - - -

- - - -GGGG

所以初始值应该是每一个字母都和空对应,而且要在之前那个值加上去,之前A和空对应如果是-3,那么T和空对应如果是-1,在二维数组中T这里的值应该是-4

最后输出二维数组中最右下角的值就是最后的解。

这里灵活之处是利用一个二维数组去保存了两个字母之间的关系,所以看起来代码特别清晰。

之后会对动态规划再细说的,这次就说这么多。

动态规划1-----------poj1080的更多相关文章

  1. POJ1080 Human Gene Functions 动态规划 LCS的变形

    题意读了半年,唉,给你两串字符,然后长度不同,你能够用'-'把它们补成同样长度,补在哪里取决于得分,它会给你一个得分表,问你最大得分 跟LCS非常像的DP数组 dp[i][j]表示第一个字符串取第i个 ...

  2. 【poj1080】 Human Gene Functions

    http://poj.org/problem?id=1080 (题目链接) 题意 给出两个只包含字母ACGT的字符串s1.s2,可以在两个字符串中插入字符“-”,使得s1与s2的相似度最大. Solu ...

  3. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  4. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  5. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  6. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  7. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  8. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  9. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

随机推荐

  1. SpringMvc之java文件下载

    首先强调,需要下载的文件只能放在项目中的webapp下 1.页面的一个超链接,链接到controller <a href="<%=path%>/download" ...

  2. MemoryStream 转 pdf

    在项目开发中用到将MemoryStream 转pdf,在转化过程中需要建了一个.dom格式的模板,先保存为.doc文件,然后再转换为.pdf. 有一个插件感觉好不错,给大家推荐一下. dll下载链接  ...

  3. Find and run the whalesay image

    Find and run the whalesay image People all over the world create Docker images. You can find these i ...

  4. Html复杂表头的实现

    实现效果 代码实现

  5. 《JavaScript高级程序设计》读书笔记 ---基本类型和引用类型的值

    变量.作用域和内存问题 基本类型和引用类型的值ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象.在 ...

  6. A. Brain's Photos ——Codeforces Round #368 (Div. 2)

    A. Brain's Photos time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  7. JQuery简介及HelloWorld

    一.JQuery是什么: -JQuery是一个JavaScript框架. 二.JQuery的优点: –轻量级 –强大的选择器 –出色的 DOM 操作的封装 –可靠的事件处理机制 –完善的 Ajax – ...

  8. android 进程(复习)

        前台进程 前台进程是用户当前正在使用的进程.只有一些前台进程可以在任何时候都存在.他们是最后一个被结束的,当内存低到根本连他们都不能运行的时候.一般来说, 在这种情况下,设备会进行内存调度,中 ...

  9. 翻译-你必须知道的28个HTML5特征、窍门和技术

    摘自by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=1058 前端的发 ...

  10. php 上传缩放图片

    有时上传图片时因为图片太大了,不仅占用空间,消耗流量,而且影响浏(图片的尺寸大小不一).下面分享一种等比例不失真缩放图片的方法,这样,不管上传的图片尺有多大,都会自动压缩到我们设置尺寸值的范围之内.经 ...