/*
状态转移方程:

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

最新文章

  1. 2000条你应知的WPF小姿势 基础篇&lt;28-33 WPF启动故事&gt;
  2. css水平垂直居中对齐方式
  3. linux启动过程分析
  4. struts2 标签怪事
  5. Android 向Application对象添加Activity监听
  6. mysql 任意连接
  7. Angular2经典文章集锦
  8. Android的Activity切换动画特效库SwitchLayout,视图切换动画库,媲美IOS
  9. memcached 内存管理 分析(转)
  10. Beauty of Array
  11. JDBC加载数据库驱动的方式
  12. JQuery实现tab切换
  13. bash编程总结
  14. 理解angularJs中的$on,$broadcast,$emit
  15. Prism for WPF再探(基于Prism事件的模块间通信)
  16. flask WTForms源码分析及自定义WTForms
  17. Linux-Shell编程之判断文件类型
  18. c语言知识
  19. 【二】Spring Cloud 入门
  20. Spark学习笔记——读写MySQL

热门文章

  1. SqlServer取分组第一条数据
  2. 【3】java之string类
  3. AWK nr nf
  4. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 49; columnNumber: 17; 元素类型为 &quot;configuration&quot; 的内容必须匹配 &quot;
  5. C++实现链队列相关操作代码
  6. 右键无法新建word文件怎么办?
  7. 寒假acm训练第三周
  8. VLC播放器 for Mac OS X
  9. 新手入门Neo4j,手把手完整教学
  10. react hook入门