原题链接 思路: 题目要求对一个序列num求其子序列最大和。因为序列元素的范围是[-1000, 1000],所以最大值max求法为:
sum对num遍历求和,每加一个就对sum和max比较,如果sum大于max,就更新max及对应子序列两端的位置,beg记录起点,end记录末尾;pre记录sum所对应的子序列的起始位置,如果sum小于零,将sum置零,pre指向下一个。(这一步是因为我们求得是最大值,当sum小于零就不能用这个求出sum的子序列了)代码:
#include<iostream> #include<cstdio> #include<iomanip> #include<algorithm> #include<vector> #include<set> #include<list> #include<queue> #include<deque> #include<unordered_map> #include<map> #include<string> #include<cstring> #include<stack> #include<cmath> #define vint vector<int> #define vstr vector<string> #define vll vector<long long> #define ll long long #define pf printf #define sf scanf #define sfd(n) scanf("%d", &n) #define sflf(n) scanf("%lf", &n) #define sfll(n) scanf("%lld", &n) #define pfd(n) printf("%d", n) #define pflf(n) printf("%lf", n) #define pfll(n) printf("%lld", n) #define pft printf("\t") #define pfn printf("\n") #define pfk printf(" ") #define PI 3.1415926 #define MAX 100000 #define M 1e18 using namespace std; int main() { int t; sfd(t); for( int cnt=1; cnt<=t; cnt++ ) { int n; sfd(n); int* num = new int[n+1]; num[0] = 0; for( int i=1; i<=n; i++ ) { sfd(num[i]); } int beg = 1, end = 1, pre = 1; int max = num[1], sum = 0; for( int i=1; i<=n; i++ ) { sum += num[i]; if( sum>max ) { beg = pre; end = i; max = sum; } if( sum<0 ) { sum = 0; pre = i+1; } } pf("Case %d:\n", cnt); pf("%d %d %d\n", max, beg, end); if( cnt<t ) { pfn; } } return 0; }