POJ 2479
2016-03-12 17:19
288 查看
题目大意:在一个数字串中找到连个连续的字串(这两个字串可以相邻),使得两个字串和最大。
思路:最大字串的变形。找出每个数字左边和最大的串,右边和最大的串, 然后左右相加算出最大的和。
思路:最大字串的变形。找出每个数字左边和最大的串,右边和最大的串, 然后左右相加算出最大的和。
代码如下:
#include<iostream> #include<cstdio> #include<cstdlib> #define MAX 0x6fffffff using namespace std; int res[50002][2],num[50002],suml[50002],sumr[50002],maxl[50002],maxr[50002]; int ncase,n; int main(){ int i,j,res; scanf("%d",&ncase); while(ncase--){ scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&num[i]); suml[0] = num[0]; for(i=1;i<n;i++) if(suml[i-1] > 0) suml[i] = suml[i-1] + num[i]; else suml[i] = num[i]; sumr[n-1] = num[n-1]; for(i=n-2;i>=0;i--) if(sumr[i+1] > 0) sumr[i] = sumr[i+1] + num[i]; else sumr[i] = num[i]; maxl[0] = suml[0]; for(i=1;i<n;i++) if(suml[i] < maxl[i-1]) maxl[i] = maxl[i-1]; else maxl[i] = suml[i]; maxr[n-1] = sumr[n-1]; for(i=n-2;i>=0;i--) if(sumr[i] < maxr[i+1]) maxr[i] = maxr[i+1]; else maxr[i] = sumr[i]; res = -MAX; for(i=0;i<n-1;i++){ if(res < maxl[i] + maxr[i+1]) res = maxl[i] + maxr[i+1]; } printf("%d\n",res); } return 0; }
相关文章推荐
- 关于地址标签address的问题
- POJ 3518 Prime Gap 筛法+二分 水题一个
- Android显示通知栏消息
- java 爬虫实现爬豆瓣电影数据并存入mysql数据库
- 【设计模式——六原则】
- 第三周上机实践项目 项目1--个人所得税计算器
- 正向代理 和 反向代理
- ThinkPHP3.2.3连接数据库
- EditText限定输入内容仅为字母和数字
- java实现随机洗牌算法
- PHP表单处理篇
- 我对打车软件的看法
- 第二周学习进度情况
- 1335闯迷宫
- [DIV/CSS] CSS3的content属性详解
- react-js demo 地址
- linux下的grep,egrep及正则表达式
- C# 水仙花数
- JavaScript对表单验证的例子
- 15.在Ubuntu 14.04上搭建vsftpd