zoukankan      html  css  js  c++  java
  • HDU 1003 Max Sum

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003

    题目大意:求一段序列中最长子段和最大的序列,并输出其左、右端点位置。
    解题思路:我们可以用DP来解这道题,sum的状态转移方程:sum[i] = max{sum[i-1]+a[i], a[i]}
    ans必定是sum[0···(k-1)]之一。由于要记录起始位置和结束位置,引入s数组记录获得sum的序列的起始元素的位置,而由sum的定义,sum[i]的结束位置是i不用另外记录。
     
    AC代码
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <iostream>
    using namespace std;
    const int M=1e5+10;
    int a[M],sum[M],s[M];
    int main()
    {
     int t,n;
     scanf("%d",&t);
     for(int ca=1;ca<=t;ca++)
     {
       if(ca>=2) printf("
    ");
       int x=1;s[1]=1;
       scanf("%d",&n);
       for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
       sum[1]=a[1];
       for(int i=2;i<=n;i++)
       {
        if(sum[i-1]>=0)  //如果此序列前i-1项和为正值,则继续寻找
        {
         sum[i]=sum[i-1]+a[i];
         s[i]=s[i-1];
        }
        else
        {
         sum[i]=a[i];//否则放弃这个序列,从当前位置开始,重新找
         s[i]=i;
        }
        if(sum[x]<sum[i]) x=i; //X为控制最大和序列的右端点;
       }
    
       printf("Case %d:
    %d %d %d
    ",ca,sum[x],s[x],x);
     }
     return 0;
    }

    好久没写这种题目了,有点衰退……。

  • 相关阅读:
    OPENCV(3) —— 对XML和YAML文件实现I/O 操作
    OPENCV(2) —— Basic Structures(二)
    OPENCV(2) —— Basic Structures(一)
    OPENCV(1)
    转:计算机视觉相关领域代码集
    ScSPM
    ScSPM & LLC
    Spatial Pyramid Matching
    Convolution & Pooling exercise
    Restricted Boltzmann Machines
  • 原文地址:https://www.cnblogs.com/www-cnxcy-com/p/5746872.html
Copyright © 2011-2022 走看看