码迷,mamicode.com
首页 > 编程语言 > 详细

【算法导论】动态规划

时间:2015-05-26 17:58:58      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

动态规划是一种高效算法,常用来求解最优化问题。本例中以寻找最长回文子序列为例来设计动态规划算法

最长回文子序列:回文是指正序与逆序相同的飞空字符串。比如civic,racecar自身都是自己的最长回文子序列。比如character的最长回文子序列为carac。

动态规划一般分为四个步骤:

1,刻画一个最优解的结构特征

2,递归地定义最优解的值

3,计算最优解的值

4,采用计算出的信息构造出一个最优解

下面按照这四个步骤来设计一个动态规划算法。

1,刻画最优解的结构

  令X【i,j】表示给定的序列,F【i,j】表示X【i,j】的最长回文子序列。则以下结论成立

(1),如果X的第一个和最后一个元素是相同的,则F【i,j】=F【i+1,j-1】

(2),如果X的第一个和最后一个元素不相同,则F【i,j】=max(F【i+1,j】,F【i,j-1】)

2,构造一个地归解

          F【i,j】=F【i+1,j-1】                当  X[i] =X【j】

          F【i, j】 =max(F[i+1,j],F[i,j-1])  当 X【i】!= X【j】

3,计算最优解

 

#include <iostream>
#include <string.h>

using namespace std;


//求最长回文子序列 
int lsp(char *a,int n){
    int dp[n][n];       
    int tem;
    int i,j;
    
    memset(dp,0,sizeof(dp));   //给dp所有元素赋初值0 
    for(i=0;i<n;i++)
        dp[i][i] = 1;
    for(i =1;i<n;i++){
        tem = 0;
        for(j=0;j<(n-i);j++){
            if(a[j]==a[j+i])
               tem = dp[j+1][j+i-1]+2;
               else
                   tem = max(dp[j+1][j+i],dp[j][j+i-1]);
            dp[j][j+i] = tem;   //dp[j][j+i]保存了X[j][j+i]的最长回文子序列长度 
        }

    }
    return dp[0][n-1];
}

int main(){
    char a[] = "charactegkgsafbdsafndskjaierqr";
    int n = strlen(a);
    cout<<"the lps is"<<lsp(a,n)<<endl;
}


4,构造最优解

      经过以上几个步骤就可以得到最优解的值。现在只能输出最长回文子序列长度,还不能直接输出最长回文子序列。有一种输出的方法是取得原序列的逆序,然后用最长公共子序列的方法来求得两个序列的最长公共子序列。

 

【算法导论】动态规划

标签:

原文地址:http://www.cnblogs.com/heee/p/4518341.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!