#33 C. Wonderful Randomized Sum ( 思维 )
来源:互联网 发布:网络视频下载器哪个好 编辑:程序博客网 时间:2024/05/21 10:08
题意:
给你一个序列,你可以选择它的前缀和后缀中的每个数字都乘以-1。前缀和后缀可以交叉也可以为空。
问能得到的最大序列和是多少。
算法:
1、如果前缀和后缀交叉,那么交叉的部分还是保持原状。
(s1 [s2 )s3 ] is equal to (s1)s2[s3] (s1,s2,s3 - some subsequences).
2、令S = A1+A2+...+A3,那么当改变这一段每个数字的符号时,S变为-S。
3、那么假设我们选择一段前缀和后缀后剩余不变的中间部分的序列和为S1,总序列的和为S。
那么操作进行后的序列和为 -(S-S1)+S1 = 2*S1-S.
S是固定的,那么只要S1尽可能大。那么问题就转化为求序列的最大子序列和。
4、求序列的最大子序列
mx = 0;
for(i=0;i<n;++i)
{
sum += a[i];
if(sum < 0)
sum = 0;
mx = max(mx, sum);
}
P.S还是要学会问题的转化啊。。。
#include<cstdio>using namespace std;typedef long long ll;ll a[100010];ll max(ll x,ll y){ return x>y?x:y;}int main(){ int n; ll s; while(scanf("%d",&n)!=EOF) { s = 0; for(int i=1;i<=n;i++) { scanf("%I64d",&a[i]); s+=a[i]; } ll mx = 0LL,sum = 0LL; for(int i=1;i<=n;i++) { sum+=a[i]; mx = max(mx,sum); if(sum<0) sum = 0; } printf("%I64d\n",2*mx-s); } return 0;}
0 0
- #33 C. Wonderful Randomized Sum ( 思维 )
- codefroces 33C Wonderful Randomized Sum DP
- Wonderful Randomized Sum
- 【思维】poj1003 Max Sum
- Randomized Algorithm
- Randomized Qruicksort
- Randomized quicksort
- Randomized quickSort
- Wonderful Life
- Wonderful life
- wonderful job
- Wonderful sayings
- 《wonderful tonight》
- poj 1844 Sum ( 数学思维 )
- WHOJ 1603 - Minimum Sum【思维】
- Hdu 5710 Digit-Sum【思维】
- [C++]LeetCode: 33 Combination Sum
- Randomized fern forest
- Android开源界面库--ResideMenu用法
- 如何导入SlidingMenu——master
- 还原数据库失败,尝试 'RestoreContainer::ValidateTargetForCreation' 时,操作系统返回了错误 '5(拒绝访问。)'
- Android开发之onClick事件的两种主要形式
- java基础学习笔记——网络编程
- #33 C. Wonderful Randomized Sum ( 思维 )
- 8-20 Android学习ing
- ios人脸识别
- IOS中的block和retain cycle (经典)
- dup and dup2的剖析
- 网站大文件(譬如:视频)上传方案及解决方式
- android屏蔽系统锁屏的办法
- AFNetworking的使用
- 7款很棒的 HTML5 视频播放器