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];
}
结果:


浙公网安备 33010602011771号