数据结构课后小作业 最大连续子序列和

题目描述:求一个序列中连续子序列和的最大值(如果全为负,则输出0)

分析思路:简单的DP题

1.分析:最开始想到的是分治,分治的复杂度是 O[n*lb(n)][姑且把lb当做以2为底的对数],由于分治的时候遇到连接处的处理问题,一不小心就想到了原来这是DP题。

2.状态转移方程:

(1)sum[i]=max{sum[i-1]+base[i],base[i]};

(2)如果sum[i]<0,sum[i]=0;

3.关于状态转移方程的分析:

(1)sum[i]表示前i个元素中,包含i的最大子序列和;

(2)base[i]表示第i个元素;

(3)sum[i]的值直接受到base[i]和sum[i-1]的影响(至于为什么不受sum[i-2],sum[i-3]...的影响,这就是DP的魅力了。很好想到的,只是不好解释。简单地说,其实sum[i-2],sum[i-3]...的影响已经在计算sum[i-1],sum[i-2]...时考虑了)

(4)如果sumi[i]为负,为了保证”如果全为负,则输出0“,需要将sum[i]初始化为0;

(5)算法复杂度:O(n)

(6)实例分析:

代码分析:

         

 1 /*
 2
 3   Title : The Bigest sblist sum
 4
 5   Date : 2015/3/11
 6
 7   Writed by yanglingwell
 8
 9   Class: Software 1403
10
11 */
12
13 #include<stdio.h>
14
15 int max(int a,int b)
16 {
17
18     return a>b?a:b;
19
20 }
21
22 int main()
23 {
24
25     int T;//T组测试数据
26
27     scanf("%d",&T);
28
29     while(T--){
30
31         int i;
32         int N;//每组数据含有N个数据的序列
33         int maxsum=0;//记录最大子序列和
34         int base[1000]={0};//记录每组的数据
35         int sum[1000]={0};//sum[i]表示前i个元素中,包含i的最大子序列和
36
37         scanf("%d",&N);
38
39         for(i=1;i<=N;i++)
40         {
41
42             scanf("%d",&base[i]);
43
44         }
45
46         for(i=1;i<=N;i++)
47         {
48
49             sum[i]=max(sum[i-1]+base[i],sum[i]);//主要状态转移方程
50
51             if(maxsum<sum[i]) maxsum=sum[i];
52
53             if(sum[i]<0) sum[i]=0;//当sum[i]小于0时前面的数据会是后面的负担,所以应该把sum初始化为0;
54
55         }
56
57         printf("%d\n",maxsum);
58
59     }
60
61     return 0;
62
63 }

测试数据:

        

题外话:实在是因为这两天在研究DP问题和记忆化搜索,所以才会水过这道题。

            DP真的很有意思。

                            

时间: 2024-10-07 05:07:04

数据结构课后小作业 最大连续子序列和的相关文章

马哥教育面授班-标准I/O和管道-课后小作业-2016年7月28

马哥教育面授班-7月28号作业 1 .将/etc/issue 文件中的内容转换为大写后保存至/tmp/issue.out 文件中 [[email protected] ~]# tr 'a-z' 'A-Z' </etc/issue | >> /tmp/issue.out [[email protected] ~]# cat /tmp/issue.out  CENTOS RELEASE 6.8 (FINAL) KERNEL \R ON AN \T \N \D \S MAGE EDUCATIO

马哥教育面授-八月一号课后小作业(linux创建用户、批量创建用户)

1.创建testuser uid 1234,主组:bin,辅助组:root,ftp,shell:/bin/csh home:/testdir/testuser [[email protected] ~]# useradd testuser -u 1234 -g bin -G root,ftp -s /bin/csh -d /testdir/testuser [[email protected] ~]# grep testuser /etc/passwd testuser:x:1234:1::/t

【算法小总结】最大连续子序列和最大连续子矩阵的关系与实现

求最大子矩阵和是DP中的一类题目,今天我们就来讲一下一维(序列)与二维(矩阵)最大和 一.求最大连续子序列和 只需定义sum,扫一遍,sum为负时sum=0,具体见代码 #include<cstdio> #include<algorithm> using namespace std; const int N=1000; int x,sum,n,maxn; int main() { while(scanf("%d",&n),n) { sum=0,maxn=

HDU1231 最长连续子序列

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 31687    Accepted Submission(s): 14214 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

HDU 1231 最大连续子序列 (动规)

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18316    Accepted Submission(s): 8127 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

转~最大连续子序列求和

最大连续子序列求和详解 1.        问题描述 输入一个整数序列(浮点数序列也适合本处讲的算法),求出其中连续子序列求和的最大值. 2.        算法分析 2.1.        算法一 2.1.1.       算法描述 遍历所有子序列并求和,比较得出其中的最大值. 2.1.2.       代码描述 1          public static int maxSubSumCubic(int[] array) { 2                 int maxSum = 0

最大连续子序列求和详解

最大连续子序列求和详解 1.        问题描述 输入一个整数序列(浮点数序列也适合本处讲的算法),求出其中连续子序列求和的最大值. 2.        算法分析 2.1.        算法一 2.1.1.       算法描述 遍历所有子序列并求和,比较得出其中的最大值. 2.1.2.       代码描述 1          public static int maxSubSumCubic(int[] array) { 2                 int maxSum = 0

hdu1231 最大连续子序列

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22849    Accepted Submission(s): 10135 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

杭电 1231 最大连续子序列

http://acm.hdu.edu.cn/showproblem.php?pid=1231 最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18622    Accepted Submission(s): 8273 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意