zoukankan      html  css  js  c++  java
  • 【noi 2.6_1481】Maximum sum(DP)

    题意:求不重叠的2段连续和的最大值。

    状态定义f[i]为必选a[i]的最大连续和,mxu[i],mxv[i]分别为前缀和后缀的最大连续和。

    注意:初始化f[]为0,而max值为-INF。要看好数据范围。

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    
    const int N=50010,INF=10010;
    int a[N],f[N],mxq[N],mxh[N];
    
    int mmax(int x,int y) {return x>y?x:y;}
    int main()
    {
        int T,n;
        scanf("%d",&T);
        while (T--)
        {
          scanf("%d",&n);
          for (int i=1;i<=n;i++)
            scanf("%d",&a[i]);
          int ans=-INF;
          
          mxq[0]=-INF,f[0]=0;
          for (int i=1;i<=n;i++)
          {
            f[i]=f[i-1]+a[i];
            mxq[i]=mmax(mxq[i-1],f[i]);
            if (f[i]<0) f[i]=0;
            /*//相同的意思
            if (f[i-1]<0) f[i]=a[i];
            else f[i]=f[i-1]+a[i];
            mxq[i]=mmax(mxq[i-1],f[i]);
            */
          }
           
          mxh[n+1]=-INF,f[n+1]=0;
          for (int i=n;i>=1;i--)
          {
            f[i]=f[i+1]+a[i];
            mxh[i]=mmax(mxh[i+1],f[i]);
            if (f[i]<0) f[i]=0;
          }
          for (int i=1;i<n;i++)
            ans=mmax(ans,mxq[i]+mxh[i+1]);
          printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    固态硬盘 每秒1.5G
    editPlus
    juqery 插入一行
    BufferedReader读取UTF8文件中文乱码
    jquery table 操作
    noSql
    javascript 开发规范
    同一服务器上安装多个tomcat
    100 个搜索引擎
    firefox 开发sdk
  • 原文地址:https://www.cnblogs.com/konjak/p/5894310.html
Copyright © 2011-2022 走看看