zoukankan      html  css  js  c++  java
  • HDU-1024

    链接:https://vjudge.net/problem/HDU-1024

    题意:

    给m 和n个数,将n个数分为m段,不交叉,求m段和的最大值。

    思路:

    刚开始一直看不懂怎么分,最后发现有的可以不选。

    dp加优化。

    Max数组记录上一段,对应几个数的最大值。

    代码:

    #include <iostream>
    #include <memory.h>
    #include <string>
    #include <istream>
    #include <sstream>
    #include <vector>
    #include <stack>
    #include <algorithm>
    #include <map>
    #include <queue>
    #include <math.h>
    #include <cstdio>
    using namespace std;
    
    typedef long long LL;
    
    const int MAXN = 1e6 + 10;
    const int INF = 0x7fffffff;
    
    int a[MAXN];
    int dp[MAXN];
    int Max[MAXN];
    
    int main()
    {
        int n, m, mmax;
    
    
        while (~scanf("%d%d", &m, &n))
        {
            for (int i = 1;i <= n;i++)
                scanf("%d", &a[i]);
    
            memset(dp,0, sizeof(dp));
            memset(Max,0, sizeof(Max));
    
            for (int i = 1;i <= m;i++)
            {
                mmax = -INF;
                for (int j = i;j <= n;j++)
                {
                    dp[j] = max(dp[j - 1], Max[j - 1]) + a[j];
                    Max[j - 1] = mmax;
                    mmax = max(mmax, dp[j]);
                }
            }
            printf("%d
    ", mmax);
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    Spring浅谈
    struts浅谈
    Tomcat启动发生的那些事儿
    sizeof的用法
    栈应用之括号匹配
    条件编译
    MySQL数据库常用命令
    快速排序
    分页查询的那些坑和各种技巧
    国外程序员收集整理的 PHP 资源大全
  • 原文地址:https://www.cnblogs.com/YDDDD/p/10353788.html
Copyright © 2011-2022 走看看