用DP解决最长子序列问题

原创 2017年01月03日 19:20:40

“最长子序列”问题(即有限空间内,满足一定条件的最长顺序子序列)

一般的解法:用DP表来记录以当前节点为末节点的序列的解,这样可以固定问题的一端,以下以两个例子来讲子序列问题。


1.在一个整数数组中,找到最长的递增子序列。


分析:用DP表来记录以当前节点为末节点的序列的最大长度。maxLength[i]=max{maxLength[k],k=0~i-1and array[i]>array[k]}


参考解答:

#include <iostream>
#include <vector>


using namespace std;




int LongestIncreasingSubsquence(int arr[],int n)
{
    vector<int> maxLength(n,1);
    int global_max=0;
    for(int i=0;i<n;i++)
    for(int j=0;j<i;j++)
    if(arr[i]>arr[j]&&maxLength[j]+1>maxLength[i])
    maxLength[i]=maxLength[j]+1;


    for(int i=0;i<n;i++)
    if(global_max<maxLength[i])
    global_max=maxLength[i];


    return global_max;
}


int main()
{
    int n;
    cin>>n;
    int arr[n];
    int sum=0;
    for(int i=0;i<n;i++)
    cin>>arr[i];
    sum=LongestIncreasingSubsquence(arr,n);
    cout<<sum;
    return 0;
}


2.在一个数组中找出一个连续的和最大的子数组


分析:只需要观察以当前节点为末节点的可能的最大sum,并使用max_sum记录。

           sum[i]=max{sum[i-1]+arr[i],arr[i]}


参考代码:

#include "stdafx.h"
#include<iostream>


using namespace std;


int maxSum(int arr[],int n)
{
int max_sum=arr[0];
int sum=arr[0];
for(int i=1;i<n;i++)
{
if(sum+arr[i]>arr[i])
{
sum=sum+arr[i];
}else{sum=arr[i];}
if(max_sum<sum)
max_sum=sum;
}
return max_sum;
}


int _tmain(int argc, _TCHAR* argv[])
{
int arr[]={1,-2,3};
int max_sum=maxSum(arr,3);
cout<<max_sum;
system("pause");
return 0;
}

NYOJ 79 & 17 & 214 单调最长子序列问题(DP)

先解释下什么叫子序列。若a序列删去其中若干个元素后与b序列完全相同,则称b是a的子序列。 我们假定存在一个单调序列{An}(以递增序列为例),现在在其后面添加一个元素a(n+1),有两种情况: 1...
  • dgq8211
  • dgq8211
  • 2012年03月03日 16:48
  • 894

动态规划解决最长子序列问题

最长子序列是什么我就不过多的叙述了 什么是动态规划我也不叙述了:动态规划就是把问题分解成一个个的小问题,并且小问题之间存在联系(可以用一些小问题的答案去求解另外小问题的答案)。 最长子序列的求解思路:...

邮局选址以及最长子序列问题

  • 2013年12月29日 15:42
  • 46KB
  • 下载

【DP入门】单调递增最长子序列

题目来自nyist第17题,详细如下: 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0 随后的n行,每行有一个字符串...

hdu--1231--最长子序列(DP)

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

HDU 5087(DP 次最长子序列)

题意:对于给定的长度为n的序列,找出第二长的最长长度 解题思路:与之前的求最长子序列有些不同。但是如果最长自序咧为ans,那么次长度只有ans-1,和ans两种情况。 由于n的范围比较小[0,10...

nyoj 单调递增最长子序列(贪心||DP)

单调递增最长子序列 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入第一行一个整数0 随后的n行,每行有一个字符串,该字符串的长度不会超过1000...

NYOJ 题目17 单调递增最长子序列 (DP) hdu 题目2845 Bean

吃土豆 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述Bean-eating is an interesting game, everyone owns an ...

求单调递增最长子序列 动态规划法(DP)

***单调递增最长子序列***** 描述**求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4**输入**第一行一个整数0随后的n行,每行有一个字符串,该字符串的长...

POJ 3356 AGTC(dp之公共最长子序列)

Let x and y be two strings over some finite alphabet A. We would like to transform xinto y allowing ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用DP解决最长子序列问题
举报原因:
原因补充:

(最多只允许输入30个字)