nefuoj1206-dp-环形子段和
来源:互联网 发布:课时优化八上英语答案 编辑:程序博客网 时间:2024/05/17 01:42
http://222.27.161.197/JudgeOnline/problemShow.php?problem_id=1206
说dp有点牵强。
中文题意
一个数组,有正有负。n个数组成一个环形,问你最大和是多少。
分两种情况
1 最大子段和不经过首尾。那么就直接算。
2 最大子段和经过首尾。那么咋算呢,可以想见的是最大子段和肯定和最小子段和 是不会发生重叠的(既然已经有最大子段和了,说明肯定有负数,那么最大子段和就是最长(并非qwq。。)最大的那个了,)
最大子段和里的负数肯定在里面。外面是正数
最小的肯定 正数在里面,负数在外面
否则没有。
这是可以求一下 最小子段和。减去的剩下那一段就是最大的了。
( 样例
6
7 2 -9 6 -5 -10
) 若最长子段 不要6,那么最短的肯定会要。就是酱紫
#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;const int maxn=50005;int main(){ int m; int a[maxn]; while(~scanf("%d",&m)) { for(int i=0;i<m;i++){ scanf("%lld",&a[i]); } long long sum1=0; long long sum2=0; long long ans1=0; long long ans2=0; long long all=0; for(int i=0;i<m;i++){ sum1+=a[i]; all+=a[i]; if(sum1<0) { sum1=0; } if(sum1>ans1){ ans1=sum1; } sum2+=-a[i]; if(sum2<0){ sum2=0; } if(sum2>ans2){ ans2=sum2; } } cout<<ans1<<endl; cout<<all<<endl; cout<<ans2<<endl; if(ans1>all+ans2) printf("%lld\n",ans1); else printf("%lld\n",all+ans2); } return 0;}
阅读全文
0 0
- nefuoj1206-dp-环形子段和
- 环形m段最大子段和 题解动态规划DP
- 最大子段和系列(二维子段和、环形数组子段和、最大m段和) 思路
- 最大子段和【DP】
- 最大子段和 (dp)
- 子段和分类 前缀和 dp
- POJ 2479 最大子段和dp
- DP最大M子段和
- DP -- 最大连续子段和
- DP-循环数组最大子段和
- 最大连续子段和dp
- 奇数最大子段和 dp
- HAUTOJ 1266 最大子段和(dp)
- 最大子段和 经典dp
- 循环数组最大子段和 (dp)
- HDU 1422重温世界杯 (环形)最长连续子段 由最大连续子段和变形的到
- DP(最大子段和) 最大子矩阵 poj_1050
- 蓝桥杯 最大子阵(dp最大子段和)
- 算法笔记--排列组合
- HDU 2071 Max Num
- 二分搜索—— 完全二叉树统计节点个数
- LeetCode 563 Binary Tree Tilt(递归 + 中间结果保存)
- PythonTip 50道题目(部分题解)
- nefuoj1206-dp-环形子段和
- Java Integer的缓存问题
- 网址收藏
- Alphago原理浅析
- strcat,strncat函数
- Spring Cloud探路(三)REST 客户端Feign
- CSDN博客积分规则
- python基础教程---更加抽象,类,继承多态封装
- C++ 分割字符串的问题不少啊