PAT甲级 1007 Maximum Subsequence Sum(DP)

题目说明:

找到和最大子序列,返回该序列的序列和与首尾元素值(注意不是元素索引),若有多个序列返回最前面的那个,若全部值都为负返回序列和为0,以及整个序列的首尾元素

输入输出解释:

Sample Input:

10 //共10个元素
-10 1 2 3 4 -5 -23 3 7 -21

Sample Output:

10 1 4 //最大元素和为10,首元素1,尾元素为4,(代表序列1 2 3 4)

思路:

动态规划的思想,到i处的和最大子序列等于i之前的和最大子序列加上i处的值,若前面最大和为负,那么取i处值

dp[i] = max((dp[i - 1] + v[i]), v[i]);  //若i号元素前的最大序列和为负,那么放弃前面的序列
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int n, max_sqe_sum = 0;
    vector<int>v;
    cin>>n;
    for(int i = 0; i < n; i++)
    {
        int t;
        cin>>t;
        v.push_back(t);
    }
    if(*max_element(v.begin(), v.end()) < 0)
    {
        cout<<0<<' '<<v[0]<<' '<<v[n - 1];
        return 0;
    }
    vector<int>dp(n);
    dp[0] = v[0];
    for(int i = 1; i < n; i++)
    {
        dp[i] = max((dp[i - 1] + v[i]), v[i]);
    }
    max_sqe_sum = *max_element(dp.begin(), dp.end());  //dp数组中的最大值代表整个序列中能找到的最大子序列和
    
    int max_pos_low, max_pos_high;
    for(int i = 0; i < n; i++)
    {
        if(dp[i] == max_sqe_sum)
        {
            max_pos_high = i;
            break;
        }
    }
    for(int i = max_pos_high; i >=0; i--)
    {
       
          if(dp[i] < 0)
          {
            max_pos_low = i + 1;
            break;
          } 
         else if(i == 0)
            max_pos_low = 0;
    }
    cout<<max_sqe_sum<<' '<<v[max_pos_low]<<' '<<v[max_pos_high];   

}

结果:

posted @ 2021-02-24 16:12  liushz  阅读(47)  评论(0)    收藏  举报