您的位置:首页 > 编程语言 > C语言/C++

用DP解决最长子序列问题

2017-01-03 19:20 218 查看
“最长子序列”问题(即有限空间内,满足一定条件的最长顺序子序列)

一般的解法:用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
;

    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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息