您的位置:首页 > 其它

最长递增子序列

2013-11-04 07:56 453 查看
最长递增子序列
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=17
求一个字符串的最长递增子序列

如:dabdbf最长递增子序列就是abdf,长度为4

这是一道基本的动态规划求解的题目,与此类似的还有:最长公共子序列
分析:用一维数组dp[i]来存储以a[i]为末元素的最长递增子序列的长度,那么dp[i]至少为1(即包含它本身)。往前寻找,如果存在a[j]<a[i],那么dp[i] = dp[j]+1。那么对于所有的j<i,且a[j]<a[i],取出最大的dp[j]。如果不存在这样的元素,那么 a[i]自身构成一个长度为1的以a[i]为末尾元素的递增子序列。
这里,并不是简单的dp[i]=dp[j]+1,而是取最大的dp[j]。举个例子来说明下这种情况:“123124”,dp[0]=1,dp[1]=2,dp[2]=3,dp[3]=1,dp[4]=2,dp[5]=?。如果直接找到了小于4的元素后,直接得到dp[5] = dp[4]+1=3,这明显是不对的。
代码如下:
#include "stdafx.h"
#include <iostream>

using namespace std;

int dp[100];
char a[100];

int max(int a, int b)
{
return a>=b?a:b;
}
int DP(int n)
{
int i=0,j=0;
dp[0] = 1;
int ans = 1;//存储最大的长度
for(i = 1;i<n;i++)
{
dp[i] = 1;
for(j=0;j<i;j++)
{
if(a[j]<a[i])
dp[i] = max(dp[i],dp[j]+1);
}
ans = max(ans,dp[i]);
}
return ans;
}

int _tmain(int argc, _TCHAR* argv[])
{
int num = 0, maxlength = 0;
cout<<"input the number of test string:";
cin>>num;
while(num--)
{
cout<<"The string:";
cin>>a;
maxlength = DP(strlen(a));
cout<<"Maxlength = "<<maxlength;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: