hdu1003

  求和最大的子串,取和以及首尾的位置。

  O(n2)的复杂度显然tle,线性O(n)一扫即可。维护一个sum值,当sum小于0时,sum清空,否则sum累加,并和maxn值比较。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define inf 0x7fffffff
 6
 7 int main() {
 8     int cas = 0;
 9     int n, t, num, e, a, ans_num;
10     scanf("%d", &t);
11     while(t--) {
12         num = 0;
13         scanf("%d", &n);
14         int maxn = -inf;
15         int sum = 0;
16         for(int i=1; i<=n; i++) {
17             scanf("%d", &a);
18             sum += a;
19             num++;
20             if(sum >= maxn) {
21                 maxn = sum;
22                 e = i;
23                 ans_num = num;
24             }
25             if(sum < 0) {
26                 sum = 0;
27                 num = 0;
28             }
29         }
30         printf("Case %d:\n%d %d %d\n", ++cas, maxn, e - ans_num + 1, e);
31         if(t) puts("");
32     }
33     return 0;
34 }
35
36
37 /*
38 3
39 5 -1 -2 1 2 -1
40 7 0 6 -1 1 -6 7 -5
41
42 Case 1:
43 3 3 4
44
45 Case 2:
46 7 1 6*/
时间: 2024-11-05 13:00:25

hdu1003的相关文章

hdu1003 1024 Max Sum&amp;Max Sum Plus Plus【基础dp】

dp是竞赛中常见的问题,也是我的弱项orz,更要多加练习.看到邝巨巨的dp专题练习第一道是Max Sum Plus Plus,所以我顺便把之前做过的hdu1003 Max Sum拿出来又做了一遍 HDU 1003 Max Sum 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目描述:给一个整数序列,求其中的一段连续子序列,使它的和最大值以及这个序列的起始下标 思路:简单的dp,抓住“连续”来入手.构造pair<int,int> dp[

解题报告:hdu1003 Max Sum - 最大连续区间和 - 计算开头和结尾

2017-09-06 21:32:22 writer:pprp 可以作为一个模板 /* @theme: hdu1003 Max Sum @writer:pprp @end:21:26 @declare:连续区间最大和 @data:2017/9/6 */ #include <bits/stdc++.h> using namespace std; int main() { //freopen("in.txt","r",stdin); int cas; cin

hdu1000,hdu1001,hdu1002,hdu1003

hdu1000 仅仅是为了纪念 1 #include <cstdio> 2 int main() 3 { 4 int a,b; 5 while (scanf("%d%d",&a,&b)!=EOF) 6 { 7 printf("%d\n",a+b); 8 } 9 return 0; 10 } hdu1001 题目说n*(n+1)/2 不不会爆 但是没和你说n*(n+1)不会爆 用下面这个小方法解决  见代码 #include <ios

HDU1003 Max Sum

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 题意:给你一组数字,求出最大的字段和. 思路:这是一个经典的dp题目,定义数组a储存一组数字,a[j]为ji个数,dp[j]表示已j结尾的最大字段和,那么dp[j]=max(dp[j-1]+a[j],dp[j]). 例如: a[]       6   -1   5    4    -7 dp[]     6    5   10  14    7 代码如下: #include <iostream

HDU1003 Max Sum 最大子序列和的问题【四种算法分析+实现】

就拿杭电OJ上的第1003题开始吧,这题比原书要复杂一些. Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14. Input The fi

hdu1003 最大连续子列和(动态规划★★★☆☆)

解题思路: 利用动态规划方法求解最大子列和,对应输入数据a[i],会有数据dp[i].数组dp中的每个元素dp[i],表示以a[i]结尾的最大连续子列和.遍历dp数组,可以找出子列和最大值. if (dp[i-1] >=0){ dp[i] = dp[i-1] + a[i]; } else{ dp[i] = a[i] } #include <iostream> #include <stdio.h> #include <stdlib.h> using namespac

hdu1003 统计出现最多的颜色数(map容器☆☆☆☆☆)

很简单的一道题,利用map容器本应该直接就过的,居然WA了好多次. 后来才发现,丢了一条更新统计结果的语句,以此为戒,以后严加注意!!! #include <iostream> #include <stdio.h> #include <stdlib.h> #include <map> #include <string> using namespace std; int main(){ int n; map<string,int> co

hdu1003 Max Sum【最大连续子序列之和】

题目链接:https://vjudge.net/problem/HDU-1003 题目大意:给出一段序列,求出最大连续子序列之和,以及给出这段子序列的起点和终点. 解题思路:最长连续子序列之和问题其实有很多种求解方式,这里是用时间复杂度为O(n)的动态规划来求解. 思路很清晰,用dp数组来表示前i项的最大连续子序列之和,如果dp[i-1]>=0的话,则dp[i]加上dp[i-1]能够使dp[i]增大:若dp[i-1]<0的话,则重新以dp[i]为起点,起点更新. #include <cs

hdu1003 简单DP

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 208286    Accepted Submission(s): 48751 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max su

hdu1003 dp 最大子数组

dp经典题,这题一年前就做过了,主要在确定begin和end有技巧,题目要求输出第一个sub,所以begin要尽量左移,end尽量右移 #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <string> const int MAXN = 1E5+10; using namespa