动态规划-3-RNA的二级结构
/*
状态转移方程:
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的二级结构的更多相关文章
- tRNA 二级结构预测可视化
tRNAdb 收录了来自104个物种的623条tRNA 序列,从数据库中下载对应物种的tRNA 序列和二级结构,以人为例 打开下面的链接 http://trna.bioinf.uni-leipzig. ...
- 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 ...
- MIT Molecular Biology 笔记7 调控RNA
视频 https://www.bilibili.com/video/av7973580/ 教材 Molecular biology of the gene 7th edition J.D. Wat ...
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
随机推荐
- RocketMQ - 消费者进度保存机制
RocketMQ设计了远程位点管理和本地位点管理两种位点管理方式.集群消费时,位点由客户端提交给Broker保存,具体实现代码在RemoteBrokerOffsetStore.java文件中:广播消费 ...
- video.js没有显示已播放时间、总时间?
我们在JS中设置了显示两个时间,但是没有显示. 经过查找,有的博文说或许是JS版本太高?我们没有换JS.另一篇博文给了我们启发,修改下样式就好了,我们一看,真的是样式问题 都改成block后就看到时间 ...
- 关于fetch请求中非表单模式(form)转化为form格式请求成功问题
首先证实一下接口请求可以成功,postman掉通 2.证实接口可以掉通之后,来发现问题 发现根本不是form表单格式3.去操作实现form表单格式 发现form格式貌似已经转换,但是请求还是不对 最后 ...
- Go指南:方法和接口
方法与指针重定向 带指针参数的函数必须接受一个指针: func ScaleFunc(v *Vertex, f float64) { v.X = v.X * f v.Y = v.Y * f} 以指针为接 ...
- pyinstaller打包后运行提示“No module named 'PyQt5' "
记录遇到的一个很傻的问题 脚本用到了PyQt5模块,安装成功脚本可以正常运行,但是使用pyinstaller 打包后,运行 exe文件提示 No module named 'PyQt5' 原因: 因为 ...
- Transformers Pipelines
pipelines 是使用模型进行推理的一种很好且简单的方法.这些pipelines 是从库中抽象出大部分复杂代码的对象,提供了一个简单的API,专门用于多个任务,包括命名实体识别.屏蔽语言建模.情感 ...
- ACGAN-pytorch
点击查看代码 import argparse import os import numpy as np import torch import torch.nn as nn import torchv ...
- JQUERY动态的修改<div>样式
首先需要引入JQUERY <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"> & ...
- Si24R2F+ 无线发射芯片的主要特性及应用介绍
Si24R2F+ 是一颗工作在 2.4GHz ISM 频段,专为低功耗无线场合设计,集成嵌入式发射基带的无线发射芯片.工作频率范围为 2400MHz-2525MHz,共有 126 个 1MHz 带宽的 ...
- vscode plugin - jenkins jack使用方法
Jenkins jack用于使vscode可直连jenkins,能推送代码至对应jenkins job进行代码测试 一.vscode安装jenkins jack 二.连接jenkins 根据提示输入j ...