/*
状态转移方程:

OPT(i , j)= max(OPT(i , j − 1) , max( 1+OPT(i , t − 1)+OPT(t + 1, j − 1))),

where the  max is taken over t such that bt and bj are an allowable base pair

(under conditions (i) and (ii) from the definition of a secondary structure)

*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define RNALEN 9
#define LEN(X) (sizeof (X) / sizeof (X[0]))
#define MAX(X,Y) ((X < Y) ? Y : X) char base[] = {'A', 'U', 'C', 'G'}; typedef char *string; string generateRNA(int size)
{
string rna = (string) malloc((size + 1) * sizeof (char) );
string start = rna;
string stop = rna + size;
int index;
srand(time(NULL)); for (; rna < stop; rna++) {
index = rand() % 4;
*rna = base[index];
}
*rna = '\0';
return start;
} void testgenerate()
{
string rna = generateRNA(RNALEN);
printf("%s\n", rna);
} /*
void matrix_print(char (*m)[], int len)
{ }
*/ int isMatch(char a, char b)
{
if (a == 'A' && b == 'U')
return 1;
else if (a == 'U' && b == 'A')
return 1;
else if (a == 'C' && b == 'G')
return 1;
else if (a == 'G' && b == 'C')
return 1;
else
return 0;
}
//核心函数:实现了状态转移方程
int opt(int (*dp)[RNALEN+1], string rna, int i, int j)
{
int maxPair, tmp, t;
maxPair = 0; for (t = i; t < j-4; t++) {
tmp = 0;
if(isMatch(rna[t], rna[j])) {
tmp++;
if (t > i + 5) { //compute leftPair
tmp += dp[i][t-1];
}
if (t < j - 6) { //comput innerPair
tmp += dp[t+1][j];
}
}
if (tmp > maxPair)
maxPair = tmp;
}
return MAX(dp[i][j-1], maxPair);
} int rna2structure(string rna, int exlen)
{
int i, j, k; int dp[exlen][exlen];
int n = exlen - 1;
memset(dp, 0, sizeof dp);//string.h
/*
for (int i = 0; i < len; i++){
for (int j = 0; j < len; j++) {
if (j % len == 0)
putchar('\n');
printf("%d, ", dp[i][j]);
}
}
putchar('\n');
*/
for (k = 5; k < n; k++) {
for (i = 1; i <= n-k; i++) {
j = i + k;
dp[i][j] = opt(dp, rna, i, j);
}
} for (int i = 0; i < exlen; i++){
for (int j = 0; j < exlen; j++) {
if (j % exlen == 0)
putchar('\n');
printf("%d, ", dp[i][j]);
}
}
putchar('\n'); return dp[1][n];
} void testStructure()
{
string rna1 = generateRNA(RNALEN);
//头部插入空格符,使得碱基下标从1开始
char rna2[] = {' ', 'A', 'C', 'C', 'G', 'G', 'U', 'A', 'G', 'U', '\0'};
char rna3[] = " ACCGGUAGU";
// printf("len of rna2 = %d\n", LEN(rna2));
// int maxPair = rna2structure(rna1, RNALEN+1);
int maxPair = rna2structure(rna2, RNALEN+1);
printf("maxPair = %d\n", maxPair);
// rna2structure(rna3, strlen(rna3));
//rna2structure(rna1, RNALEN);
} int main()
{
testgenerate();
testStructure();
// printf("MAX(3, 5) = %d\n", MAX(3, 5));
return 0;
}

实现自《Algorithm Design》

6.5 RNA Secondary Structure: Dynamic Programming over Intervals

动态规划-3-RNA的二级结构的更多相关文章

  1. tRNA 二级结构预测可视化

    tRNAdb 收录了来自104个物种的623条tRNA 序列,从数据库中下载对应物种的tRNA 序列和二级结构,以人为例 打开下面的链接 http://trna.bioinf.uni-leipzig. ...

  2. Hairpin|Bulge|Loop|假结|共变化(进化)|单序列预测|snRNA|snoRNA|siRNA|microRNA|piRNA|LncRNA|antisense RNAs|cis-NATs|trans-NATs|假基因|环形RNA

    生物信息学 GU也可以配对,即“wobble” pairing GU. Hairpin发夹结构,最少不能少于3个碱基.没有配对 Bulge 单侧配对 Loop双侧配对 假结,游离的leading ed ...

  3. MIT Molecular Biology 笔记7 调控RNA

    视频  https://www.bilibili.com/video/av7973580/ 教材 Molecular biology of the gene 7th edition  J.D. Wat ...

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

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

  5. 简单动态规划-LeetCode198

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

  6. 动态规划 Dynamic Programming

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

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

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

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

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

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

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

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

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

随机推荐

  1. 编程基础与python介绍

    思维导图 https://gitee.com/starry-tong/python-data/blob/pyimage/day02.png 1.计算机内部存储数据的原理 2.编程语言的发展史 3.py ...

  2. 【转载】python解决文本乱码问题及文本二进制读取后的处理

    转自:https://blog.csdn.net/u011316258/article/details/50450079 python解决文本乱码问题及文本二进制读取后的处理 吲哚乙酸 当文本中含有很 ...

  3. K8s集群调度

    k8s 调度器 Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上.听起来非常简单,但有很多要考虑的问题: 公平:如何保证每个节点都能被分配资源 ...

  4. pictrue类的练习

    这里遇到一个问题,因为导入的文件格式很大,所以内存占用特别高,就会在运行一段时间过后报错:内存不够 然后用了一个GC.collect():的方法,加在了timer控件里,让程序每隔1000ms换图时也 ...

  5. codeforce C. Maximal Intersection

    http://codeforces.com/contest/1029/problem/C 从第一天吃晚饭做到第二天吃完饭--你无法想象我的代码曾经150行 o( ̄┰ ̄*)ゞ 找到所有线段最远的左边和最 ...

  6. 在docker容器外,使用docker容器中的环境

    docker exec -it 334529194f22 /bin/bash -c 'pip install requests-2.22.0-py2.py3-none-any.whl' 其中33452 ...

  7. CodeGym自学笔记12——类名

    类的全名 类的全名由所有包的名称(由句点分隔)和类名组成. "要在代码中使用类,你需要指出类的全名.你也可以使用类的短名称,即只使用类名,但你需要'导入类'.这意味着在声明类之前,你要指出单 ...

  8. docker容器SSH服务自启动

    使用ubuntu容器,会在容器内安装ssh服务,但是会发现当容器重启后,如何实现ssh服务自动重启呢?可以使用Dockerfile参看此处 ,本文介绍一种在docker容器中进行配置的方法 安装ssh ...

  9. python 日志分割器 大文本处理

    import math i=0 filename='' write='' Rline = '' def writeFile(fileName,line): global filename global ...

  10. Maven使用tomcat7-maven插件部署项目问题

    Cannot invoke Tomcat manager: Connection refused: connect -> [Help 1] 检查tomcat-users.xml的用户配置,用户权 ...