• HDU 1024 Max Sum Plus Plus(m个子段的最大子段和)


    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1024

    Max Sum Plus Plus

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 35988    Accepted Submission(s): 12807


    Problem Description
    Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem.

    Given a consecutive number sequence S1, S2, S3, S4 ... Sx, ... Sn (1 ≤ x ≤ n ≤ 1,000,000, -32768 ≤ Sx ≤ 32767). We define a function sum(i, j) = Si + ... + Sj (1 ≤ i ≤ j ≤ n).

    Now given an integer m (m > 0), your task is to find m pairs of i and j which make sum(i1, j1) + sum(i2, j2) + sum(i3, j3) + ... + sum(im, jm) maximal (ix ≤ iy ≤ jx or ix ≤ jy ≤ jx is not allowed).

    But I`m lazy, I don't want to write a special-judge module, so you don't have to output m pairs of i and j, just output the maximal summation of sum(ix, jx)(1 ≤ x ≤ m) instead. ^_^
     
    Input
    Each test case will begin with two integers m and n, followed by n integers S1, S2, S3 ... Sn.
    Process to the end of file.
     
    Output
    Output the maximal summation described above in one line.
     
    Sample Input
    1 3 1 2 3 2 6 -1 4 -2 3 -2 3
     
    Sample Output
    6 8
    Hint
    Huge input, scanf and dynamic programming is recommended.
     
    Author
    JGShining(极光炫影)
     
    分析:
    m个子段的最大子段和
    子段不重合
    第一次写这个问题,还不是很懂
    我是参考的大佬的博客:
     
    回来更新一波
    今天训练赛又遇到这个问题了,说说我的理解
    这个问题的dp做其实跟LIS和LCS的有一丁点的像的
    外层n循环,i
    内层 0到i-1循环 j
    每第i次选择都是在前面的i个中(不包括i)选最大的加上当前a【i】的值
    上面都是自己瞎逼逼,不好理解,看下面
     
    分析:
    最大m段字段和问题是由最大字段和问题演变来的
    最大字段和问题大家应该都知道
    最大字段和是把每个数据看成一个对象,从而组成一个子段
     
    核心:那么最大m段字段和,就是把一个子段看成一个对象,再进行最大字段和的操作,从而组成m个最大子段,所以是对象变了(自己也是突然想到)
     
     
    code:
    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<string.h>
    #include<set>
    #include<map>
    #include<list>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    int mon1[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int mon2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
    int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    
    #define INF 0x7fffffff//无穷大
    #define max_v 1000010
    int a[max_v];
    int now[max_v];// now[j]:包含第j个元素的最大和
    int pre[max_v];// pre[j]:前j个元素的最大和,不包括第j个元素
    int main()
    {
        int n,m,maxx;
        while(~scanf("%d %d",&m,&n))
        {
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            memset(now,0,sizeof(now));
            memset(pre,0,sizeof(pre));
            for(int i=1;i<=m;i++)//m个子段
            {
                maxx=-INF;
                for(int j=i;j<=n;j++)
                {
                    now[j]=max(now[j-1]+a[j],pre[j-1]+a[j]);
                    //now[j] 有两种来源,一种是直接在第i个子段后面加a[j],一种是a[j]单独成为一个子段
                    pre[j-1]=maxx;//更新pre使得pre[j-1]是前j-1个中的最大子段和
                    maxx=max(now[j],maxx);
                }
            }
            printf("%d
    ",maxx);
        }
        return 0;
    }
  • 相关阅读:
    Log4net源码分析(一)
    找不到具有绑定 WSHttpBinding 的终结点的与方案 http 匹配的基址。注册的基址方案是 []。
    C#线程锁使用全功略
    C#泛型版的超级优化的快速排序算法和插入排序、二分查找算法
    用WM_COPYDATA实现进程通信
    构建插件式的应用程序框架(二)-订立契约
    Ajax网站安全,谁来保证
    构建插件式的应用程序框架(三)-动态加载
    构建插件式的应用程序框架(八)-视图服务的简单实现
    插件架构学习体会(一) 宿主程序说:插件你得听我的
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9314528.html
Copyright © 2020-2023  润新知