题目44:子串和
来源:互联网 发布:犀牛软件百度云 编辑:程序博客网 时间:2024/05/22 07:49
题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=44&rec=sim
描述
给定一整型数列{a1,a2…,an},找出连续非空子串{ax,ax+1,…,ay},使得该子序列的和最大,其中,1≤x≤y≤
输入
第一行是一个整数N(N≤10)表示测试数据的组数)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100≤I≤100),表示数列中的所有元素。(0<n≤1000000)
输出
对于每组测试数据输出和最大的连续子串的和。
样例输入
15
1 2 -1 3 -2
样例输出
5算法思想:
动态规划,从左往右循环一遍,sum计算当前和,max记录sum的最大值,当sum<0时,说明sum加上后面的数肯定比后面的数直接相加小,故将sum直接赋值为0;当sum大于max时,更新max,这样循环完毕,max就是最大的连续子串的和。
源代码
#include <cstdio>#include <algorithm>using namespace std;int p;int main(){ int N, n, ans, max, sum; scanf("%d",&N); while (N--) { scanf("%d", &n); ans = 0, max = -101, sum = 0; for (int i = 0; i < n; i++) { scanf("%d", &p); sum += p; if (sum > max) { max = sum; } if (sum < 0) { sum = 0; } } printf("%d\n",max); } return 0;}
最优源代码
#include<stdio.h>int main(){ int n,m,i,max,sum; scanf("%d",&n); while(n--) { max=0; scanf("%d",&m); scanf("%d",&sum); max=sum; while(--m) { scanf("%d",&i); if(sum<0) sum=i; else sum+=i; if(sum>max) max=sum; } printf("%d\n",max); }}
算法复杂度:
由源代码可知,只需循环遍历一遍,故算法时间复杂度为O(n)。
阅读全文
1 0
- 题目44-子串和
- 题目44:子串和
- 南阳oj 题目44 子串和
- 计蒜客-最大子阵列 / NYOJ题目44-子串和
- 题目六 子串和
- 南阳理工OJ_题目44 子串和
- NYOJ--44(动态规划)-题目----------------------------- 子串和
- NYOJ——题目44:子串和
- 子串和(南阳理工oj-题目44)
- 题目1149:子串计算
- 题目1555:重复子串
- 题目1252:回文子串
- 题目1149:子串计算
- 题目1252:回文子串
- 题目1149:子串计算
- 题目1555:重复子串
- 题目1149:子串计算
- 题目1149:子串计算
- bzoj3687 简单题
- appium for windows 环境搭建
- 深网与暗网初学者指南
- linux关于bashrc与profile的区别
- 通过 PowerShell 的方式增加虚拟机终结点
- 题目44:子串和
- Vue 列表渲染怎么取到具体的某个值
- 根据同义词创建视图
- orocos xenomai dlopen 内存权限问题:
- 线程 实例
- Linux 内核动态调试
- 顺序栈基本运算的实现
- web学习知识$用法
- 安卓7.0动态权限申请