/*
状态转移方程:

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. Windows必装软件,一个比一个好用

    前言 每次重装完系统,或者新换了电脑之后,你第一时间会安装哪些软件呢?那这次小卷就为大家带来18款电脑必备软件,它们共同的特点是绿色小巧无广告,而且在我看来,每一个同类型软件中最出类拔萃的,我就这么说 ...

  2. .Net DI(Dependency Injection)依赖注入机制

    1.简介 DI:Dependency Injection,即依赖注入,他是IOC的具体实现. 在DI中,底层服务对象不再负责依赖关系的创建,而是交由顶端调用进行管理注入 好处:降低组件之间的耦合度,使 ...

  3. Angular 发布IIS

    1.IIS服务器需要安装插件 安装 Url https://www.iis.net/downloads/microsoft/url-rewrite 2.修改配置 在src目录下,添加 web.conf ...

  4. python编写程序练习-车牌摇号程序

    import random import string count = 0      #设定计数器 car_numbers = []   # 创建一个列表,用来接收生产的车牌号池 while coun ...

  5. Linux新手渣渣上路史

    Linux新手渣渣上路史 时至2022年,IT行业的迅速发展大家也有目共睹,IT行业在社会的发展中起着举足轻重的作用.其中一角Linux系统,从诞生到开源,再到现在受大众的欢迎,是一个很好的例子.Li ...

  6. ImGui渲染3d数据的方法

    ImGui本质上是个2d渲染引擎,渲染3d数据只能另辟蹊径.目前主要有3种方法: 一是2d转换,可以自己处理3维坐标向屏幕坐标的转换,然后调用ImGui的二维绘制函数进行渲染: 二是3d贴图,首先在3 ...

  7. TDSQL-C Serverless 服务是如何实现通过接入层来实现恢复感知

    在一些极限的测试场景下,数据库实例会频繁的自动启停,这时候如何保证数据库实例停止后快速恢复呢?如何保证在恢复数据库实例时无需用户重复链接,直到恢复访问? 站在用户的角度考虑,谁都不希望数据库每次启停都 ...

  8. 去除button默认样式

    不加样式之前的: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  9. 如何将PDF文件中的部分信息隐藏或遮盖呢?

      由于工作需要,总是需要对PDF文件中的内容进行部分隐藏.之前,作为VIP,可以使用某软件对PDF中的信息进行部分遮盖,现在,VIP到期了,我也不想继续花钱了(哭穷,嘻嘻)   在信息时代,只要会百 ...

  10. Mac 如何用python下载Mac OS

    ​ Python脚本下载 开源地址:macadmin-scripts 打开终端 : git clone https://github.com/munki/macadmin-scripts 下载inst ...