/*
状态转移方程:

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. C语言多维数组的实现与操作

    常量和所需的头文件 #include<stdio.h> #include<stdarg.h> #include<stdlib.h> #define MAX_ARRA ...

  2. (五)REDIS-哨兵与集群

    概念介绍: Sentinel(哨兵)是Redis的高可用性解决方案,主要是通过一个或多个Sentinel实例组成的Sentinel系统对任意多个主服务器以及这些主服务器的所有从服务器进行监视,当某个主 ...

  3. rsut 字节数组和字符串转换

    一.字符串转换为字节数组 let s = String::from("str"); let v = s.as_bytes(); // &[u8] println!(&quo ...

  4. Code Review在TDSQL-C 的应用实践

    1.1 为什么重视Code Review? 结合下面这个例子,我们来谈谈为什么要重视code review.假设你作为新人刚入职,领导分配了一个需求,于是接下来做了下面这些事: 为了完成任务疯狂敲了三 ...

  5. RuntimeError: CUDA error: device-side assert triggered

    调试diffusion模型时在loss处报错,报错位置: `acc_train_loss += loss.item()` RuntimeError: CUDA error: device-side a ...

  6. pictrue类的练习

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

  7. vscode开发vue3+ts环境搭建

    一.开发环境准备 1.nvm 2.vscode 3.node 4.chome 5.git 6.npm install -g yarn tyarn 7.tyarn global add commitiz ...

  8. Vue 项目中实现的微信、微博、QQ空间分享功能(亲测有效)

    需求:文章添加分享功能(包括微信.微博.QQ空间) 如下图所示: 点击图标分别跳转到如下界面:(实现效果如下) 话不多说直接代码(可以封装成组件) <template> <div c ...

  9. C. Tea Tasting

    https://codeforces.com/contest/1795/problem/C 用二分+前缀和+差分卡过 #include <iostream> #include <cs ...

  10. 使用yum快速安装mysql-5.7(用于测试)

    1)CentOS 7 下安装 MySQL 5.7 下载并安装MySQL官方的 Yum Repository [wget -i -c http://dev.mysql.com/get/mysql57-c ...