• 1052 最大M子段和(DP)


    基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
    N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的。如果M >= N个数中正数的个数,那么输出所有正数的和。
    例如:-2 11 -4 13 -5 6 -2,分为2段,11 -4 13一段,6一段,和为26。
    Input
    第1行:2个数N和M,中间用空格分隔。N为整数的个数,M为划分为多少段。(2 <= N , M <= 5000)
    第2 - N+1行:N个整数 (-10^9 <= a[i] <= 10^9)
    Output
    输出这个最大和
    Input示例
    7 2
    -2
    11
    -4
    13
    -5
    6
    -2
    Output示例
    26



    //题意有点难懂,应该是说,从 N 个数中,选出小于等于 M 段,不相交,并且和最大
    显然dp题,但怎么设计比较难,假设划分成 x 段,对于每个元素,有这样的考虑,
    1、和上一个连起来,就是上一个位置分为 x 段
    2、或者新开一段,就是上一个位置分 x-1 段
    那么, dp[i][j] 表示前 i 个数选出 j 段,并且最后一段有 dat[i]
    dp[i][j] = max(dp[i-1][j] , dp[j-1 -- i-1][j-1])
    然后发现这是 n^3 ,得优化一下
    dp[j-1 -- i-1][j-1] 这个可以用一个数组存一下,
    设为 pre[i][j] ,表 前 i 个数,选出 j 段的最大和
    pre[i][j] = max(pre[i-1][j],dp[i][j])
    然后可以发现,最多和 j-1 有关,所以可以滚动一下优化空间,就可以愉快的dp辣
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define MOD 1000000007
     4 #define INF 0x3f3f3f3f
     5 #define eps 1e-9
     6 #define LL long long
     7 #define MX 5005
     8 
     9 int n,k;
    10 int dat[MX];
    11 LL dp[MX][2];
    12 LL pre[MX][2];
    13 
    14 int main()
    15 {
    16     while(scanf("%d%d",&n,&k)!=EOF)
    17     {
    18         dp[0][0]=0, pre[0][0]=0;
    19         for (int i=1;i<=n;i++)
    20         {
    21             scanf("%d",dat+i);
    22             pre[i][0]=0;
    23             dp[i][0]=0;
    24         }
    25         LL ans =0;
    26         for (int j=1;j<=k;j++)
    27         {
    28             for (int i=1;i<=n;i++)
    29             {
    30                 dp[i][j&1] = max(dp[i-1][j&1],pre[i-1][(j-1)&1])+dat[i];
    31                 pre[i][j&1] = max(pre[i-1][j&1],dp[i][j&1]);
    32             }
    33             ans = max(ans,pre[n][j&1]);
    34         }
    35         printf("%lld
    ",ans);
    36     }
    37     return 0;
    38 }
    View Code
    
    
    
     
    
    
    
     
     
  • 相关阅读:
    通过Eclipse生成可运行的jar包
    消息队列原理概念扫盲
    为mutable类型的容器(array,set等)添加kvo,有点麻烦,供参考和了解下吧
    iOS archive(归档)的总结 (序列化和反序列化,持久化到文件)
    http相关概念在iOS中的使用介绍
    AutoLayout技术选型和应用
    addChildViewController相关api深入剖析
    SymmetricDS 完全配置安装手册
    决策树之 C4.5 算法
    决策树之 ID3 算法
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/7635073.html
Copyright © 2020-2023  润新知