关闭

RNA secondary structure(Dynamic Programming)

标签: Dynamic Programming
272人阅读 评论(0) 收藏 举报
分类:
//
//  main.cpp
//  RNA
//
//  Created by Longxiang Lyu on 6/1/16.
//  Copyright (c) 2016 Longxiang Lyu. All rights reserved.
//

#include <iostream>
#include <string>
#include <vector>

using namespace std;

bool complement(char c1, char c2)
{
    return  (c1 == 'A' && c2 == 'U') ||
            (c1 == 'U' && c2 == 'A') ||
            (c1 == 'C' && c2 == 'G') ||
            (c1 == 'G' && c2 == 'C');
}

void findSolution(const vector<vector<int>> &M, int i, int j, vector<pair<int, int>> &pairs)
{
    for (int t = i; t < j - 4; ++t)
    {
        if (M[i][j] == 1 + M[i][t - 1] + M[t + 1][j - 1])
        {
            pairs.push_back({t, j});
            findSolution(M, i, t - 1, pairs);
            findSolution(M, t + 1, j - 1, pairs);
        }
    }
}

int RNA(string seq, vector<pair<int, int>> &pairs)
{
    for (auto &c : seq)
        c = toupper(c);
    int n = static_cast<int>(seq.length() - 1);
    vector<vector<int>> M(n + 1, vector<int>(n + 1, 0));
    
    for (int interval = 5; interval <= n -1; ++interval)
    {
        for (int i = 1; i <= n - interval; ++i)
        {
            // compute M[i][j]
            int j = i + interval;
            int opt = M[i][j - 1];      // case 1: bj is not involved in pair
            
            
            for (int t = i; t < j - 4; ++t)
            {
                if (complement(seq[t], seq[j]) && opt < 1 + M[i][t - 1] + M[t + 1][j - 1])
                {
                    opt = 1 + M[i][t - 1] + M[t + 1][j - 1];        // case 2: choose the largest pair sum
                }
            }
            M[i][j] = opt;
        }
    }
    findSolution(M, 1, n, pairs);
    return M[1].back();
}

int main(int argc, const char * argv[])
{
    string seq = "*AUGUGGGCAU";
    vector<pair<int, int>> ret;
    cout << "Max number of pairs: " << RNA(seq, ret) << endl;
    for (auto a : ret)
    {
        cout << a.first << " - " << a.second << endl;
    }

    return 0;
}

Reference:

http://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/06DynamicProgrammingI.pdf

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

五大常用算法 ----DP 动态规划(Dynamic Programming)

一、基本概念     动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 二、基本思想...
  • Caroline424
  • Caroline424
  • 2016-07-24 22:35
  • 2155

动态规划(dynamic programming)初步入门

通过金矿模型介绍动态规划 点击下载01背包测试数据.rar                 对于动态规划,每个刚接触的人都需要一段时间来理解,特...
  • bit_zcy
  • bit_zcy
  • 2016-03-22 10:16
  • 3152

CrackingtheCodeInterview之递归和动态规划

NO.1 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一个方法,计算小孩有多少种上楼梯的方式。 解法:试想小孩在上到第n阶台阶前可能选择了一次上几阶台阶,1/2/3都有可能...
  • Alex123980
  • Alex123980
  • 2016-07-07 21:43
  • 400

微分动态规划

本文从维基百科出发,详细介绍了动态微分规划(DDP)算法。
  • u013745804
  • u013745804
  • 2017-03-08 18:22
  • 305

基于动态规划(dynamic programming)的计算两个字符串的编辑距离

以fast和cats为例 算法为: 实现代码:(以cats和fast为例) public class dynamic { public static int mini(int ...
  • iamubbTing
  • iamubbTing
  • 2016-04-28 11:36
  • 292

dynamic programming (动态规划)浅谈

昨天突然看到dynamic programming,这个是个经典的algorithm,虽然自己在大学和研究生的algorithm课程中都有对这个algorithm的介绍,但无奈自己大学和研究生课堂都属...
  • Be_patience
  • Be_patience
  • 2014-12-13 20:09
  • 139

动态规划Dynamic Programming的总结

最近找工作需要些计算机算法,所以把最常见的动态规划方法整理一下,从浅到深的进行一下分析。 一、动态规划的原理 1、动态规划的基本思路 许多问题在实现的过程中都是把原问题分解为子问题进行处理,再把...
  • woaidapaopao
  • woaidapaopao
  • 2017-02-26 23:37
  • 125

动态规划翻译自维基百科

动态规划 维基百科,自由的百科全书 动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为...
  • qq_27911965
  • qq_27911965
  • 2016-08-16 10:19
  • 386

RNA测序研究现状与发展

RNA测序研究现状与发展  : RNA测序(RNA-seq)是最近兴起的一种基因表达研究技术,不仅可以对基因表达的情况进行整理、归类(cataloging),也可以对基因表达...
  • u013223724
  • u013223724
  • 2013-12-31 15:28
  • 1279

路由配置:理解secondary ip address

原文《http://www.233.com/cisco/ccna/20070826/100602899.html》 为端口设置一个IP地址,在端口设置状态下   ip address 本端口I...
  • fzxy002763
  • fzxy002763
  • 2016-04-30 03:08
  • 3430
    个人资料
    • 访问:11943次
    • 积分:678
    • 等级:
    • 排名:千里之外
    • 原创:58篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类