用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...

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

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

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-最长单增最长子序列

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 ...
  • wximo
  • wximo
  • 2014-05-12 20:56
  • 471

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

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

HDU 5087(DP 次最长子序列)

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

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

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

算法笔记:动态规划求解最长子序列问题

动态规划法 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。 为...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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