zoukankan      html  css  js  c++  java
  • HDU 1231:最大连续子序列 解题报告

    第一次写博客, 自己总结写出了一道题感觉值得保存。

    自己总结的规律:求最大连续子序列, 可以先求包括第N项在内的前N项最大值, (因为每一项都求过后, 前N项最大值最大的那一个元素所连续的序列即为最大连续子序列), 每次求包括第N项在内的前N项最大值时记录开始下标。

    列:1 2 -2 5 -8 3;

    第1项:1 开始下标为1

    第2项:3 开始下标为1

    第3项:1 开始下标为1

    第4项:6 开始下标为1

    第5项:-2 开始下标为1

    第6项: 3 开始下标为6

    最大值为几在于其前面项最大值是不是小于0;

    如果不小于0 即加上为最大  开始下标不变;

    如果 小于0, 最大为自己本身, 开始下标变成自己下标;

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define N 10010
    #define max(a, b) (a > b ? a : b)

    int max[N], a[N], start[N];// max[N]为前N项中 包括a[N]在内和的最大值, start[N]保存的是 前N项包括a[N]在内取最大值时的初始下标;

    int main()
    {

    int i, n, j, flag, maxn, flag_end, flag_start;
    while(scanf("%d", &n), n)
    {
    flag = 0;//标志来判断是不是所有元素都为负数;
    for(i = 1; i <= n; i++)//从1开始,start[]的下标更容易理解;
    {
    scanf("%d", &a[i]);
    if(a[i] >= 0)
    flag = 1;//只要有一个数字不为负数,flag = 1;
    }

    if(flag == 0)
    {
    printf("0 %d %d\n", a[1], a[n]);//全为负数, 输出0, 第一项,最后一项;
    continue;
    }

    max[1] = a[1], start[1] = 1;

    for(i = 2; i <= n; i++)
    {
    if(max[i - 1] >= 0)
    {
    max[i] = max[i - 1] + a[i];//若a[i]的前一项大于0, 则加。
    start[i] = start[i - 1];//开始坐标仍旧为前一项的开始坐标;
    }
    else
    {
    max[i] = a[i];//若前一项不大于0, 则用a[i]更新max[i]最大值;
    start[i] = i;//开始坐标为i;
    }
    }
    maxn = max[1];
    flag_end = a[1];
    flag_start = a[start[1]];//初始化,准备求最大连续子序列。

    for(i = 1; i <= n; i++)
    if(maxn < max[i])//更新最大连续子序列与起始下标, 结束下标;
    {
    maxn = max[i];
    flag_end = a[i];
    flag_start = a[start[i]];
    }

    printf("%d %d %d\n", maxn, flag_start, flag_end);
    }

    }

  • 相关阅读:
    Android的activity的生命周期
    COCOS学习笔记--重力感应Acceleration
    【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(2)
    cocos2d-x改底层之获取UIListView的实际内容大小
    Android 使用ListView的A-Z字母排序功能实现联系人模块
    Netty3 源代码分析
    A002-开发工具介绍
    数据结构:二叉树(前,中,后,层次)非递归遍历。
    jQuery开发之Ajax
    cocos2d-x-3.6 引擎概述
  • 原文地址:https://www.cnblogs.com/wangyuhao/p/4243761.html
Copyright © 2011-2022 走看看