zoukankan      html  css  js  c++  java
  • Max Sum(经典DP)

    求最长总和序列,状态转移方程:dp[i] = max(dp[i-1]+a[i].a[i])

    因为可能有负数,所以要判断dp是否大于0,如果小于0则序列中断,从中断点开始

    起始点可以用数组s保存,有中断点就保存,没有的话s[i]=s[i-1]

    另外还有输出最后换行的问题,有时中间要换行但最后不需要换行,如果没注意可能会出现PE

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    using namespace std;
    
    #define mem(a,b) memset(a,b,sizeof(a))
    #define pf printf
    #define sf scanf
    #define debug printf("!
    ")
    #define INF 10000
    #define MAX(a,b) a>b?a:b
    #define blank pf("
    ")
    #define LL long long
    
    int n;
    int dp[100010];
    int a[100010];
    int s[100010];
    
    int main()
    {
              int i,j,t,k;
              sf("%d",&t);
              for(k = 1;k<=t;)
              {
                        sf("%d",&n);
                        mem(dp,0);
                        mem(a,0);
    
                        for(i = 0;i<n;i++)
                        {
                                  sf("%d",&a[i]);
                        }
                        dp[0]=a[0];
                        int e=1;
                        for(i = 1;i<n;i++)
                        {
                                  if(dp[i-1]>=0)
                                  {
                                            dp[i] = max(dp[i-1]+a[i],a[i]);
                                            s[i] = s[i-1];
                                  }
                                  else
                                  {
                                            dp[i] = a[i];
                                            s[i] = i;
                                  }
                        }
                        int max = -1000;
                        for(i=0;i<n;i++)
                        {
                                  if(max<dp[i])
                                  {
                                            max = dp[i];
                                            e=i;
                                  }
                        }
                        pf("Case %d:
    ",k);
                        pf("%d %d %d
    ",max,s[e]+1,e+1);
                        k++;
                        if(k<=t)
                                  blank;
    
              }
    }
  • 相关阅读:
    思维导图github地址
    python操作mongodb根据_id查询数据的实现方法
    如何让nginx显示文件夹目录
    Scrapy爬虫返回302重定向问题解决方法
    K8s
    Dockerfile文件详解
    k8s简介
    mongodb存储过程
    存储过程详解
    Docker 镜像加速
  • 原文地址:https://www.cnblogs.com/qlky/p/5155203.html
Copyright © 2011-2022 走看看