标签:
动态规划是一种高效算法,常用来求解最优化问题。本例中以寻找最长回文子序列为例来设计动态规划算法
最长回文子序列:回文是指正序与逆序相同的飞空字符串。比如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