zoukankan      html  css  js  c++  java
  • 最大连续子序列和

    最大连续子序列和

    因为最大 连续子序列和只可能是以位置0~n-1中某个位置结尾。当遍历到第i个元素时,判断在它前面的连续子序列和是否大于0,如果大于0,则以位置i结尾的最大连续子序列和为元素i和前门的连续子序列和相加;否则,则以位置i结尾的最大连续子序列和为元素i。

    例题

    相关题目练习:

    hdu 1003:http://acm.hdu.edu.cn/showproblem.php?pid=1003

    代码

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    using namespace std;
    int main()
    {
    
        int n,k;
        int pos1 = 1, pos2 = 1, x = 1;
        int maxx, now;
        scanf("%d", &n);
        for (int j = 1; j <=n; j++)
        {
            int temp;
            scanf("%d", &k);
            scanf("%d", &temp);
            pos1 = 1, pos2 = 1, x = 1;
            maxx = now = temp;
            for (int i = 2; i <= k; i++)
            {
                scanf("%d", &temp);    
                if (now + temp < temp) { now = temp; x = i; }
                else now += temp;
                if (now > maxx)
                {
                    maxx = now;
                    pos1 = x; pos2 = i;
                }
            }
                printf("Case %d:
    ", j);
                printf("%d %d %d
    ", maxx, pos1, pos2);
                if (j != n)printf("
    ");
            
        }
    }

    hdu 1231:http://acm.hdu.edu.cn/showproblem.php?pid=1231

     代码

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    using namespace std;
    int dp[10003];
    int main()
    {
    
        int n;
        int pos1 = 1, pos2 = 1, x = 1;
        int maxx, now;
        while (1)
        {
            scanf("%d", &n);
            if (n == 0)break;
            memset(dp, 0, sizeof(dp));
                int temp;
                scanf("%d", &dp[1]);
                pos1 = 1, pos2 = 1, x = 1;
                maxx = now = dp[1];
                for (int i = 2; i <= n; i++)
                {
                    scanf("%d", &dp[i]);
                }
                for (int i = 2; i <= n; i++)
                {
                    if (now + dp[i] < dp[i]) { now = dp[i]; x = i; }
                    else now += dp[i];
                    if (now > maxx)
                    {
                        maxx = now;
                        pos1 = x; pos2 = i;
                    }
                }
                if(maxx<0)    printf("%d %d %d
    ", 0, dp[1], dp[n]);
                else printf("%d %d %d
    ", maxx, dp[pos1], dp[pos2]);
            }
    }

    参考:https://blog.csdn.net/sgbfblog/article/details/8032464

  • 相关阅读:
    aliyun搭博客从零到一
    centos8飞行驾驶舱和docker安装
    squid的三种模式
    Linux和windos路由
    ca认证(https)
    shell脚本1
    heartbeat双主高可用
    Linux字符界面字符颜色显示
    不同尺寸的图片垂直水平居中的三种形式
    两栏三栏自适应布局
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/13080846.html
Copyright © 2011-2022 走看看