题目链接:就在南阳上面
思路:刚看到这道题的时候我以为用普通的DP就能做 想了好久状态转移方程也没写出来 最后实在没招在网上搜索了一下才知道这道题分两种情况
就是一个是最大值包括头和尾另一种是不包括 不包括的很简单普通的DP就能做 包括的需要分析最大值是不是最大的 如果不是 就用所有值减去最小值就可以了
下面看代码
#include#include #include #include using namespace std; const long long INF = 999999999999999; const int N = 50000 + 10; int a[N]; long long min_num, max_num;//保存字段和的最大值与最小值 int main() { int n; while (~scanf("%d", &n)) { min_num = INF;//初始化 max_num = -INF; long long t1 = 0, t2 = 0; long long sum = 0; for (int i = 0; i < n; i++) { scanf("%lld", &a[i]); sum += a[i]; if (t1 > 0) t1 += a[i]; else t1 = a[i]; if (t1 > max_num) max_num = t1; if (t2 < 0) t2 += a[i]; else t2 = a[i]; if (t2 < min_num) min_num = t2; } if (max_num < sum - min_num) max_num = sum - min_num; printf("%lld\n", max_num); } return 0; }