基准时间限制: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辣
 #include <bits/stdc++.h>
using namespace std;
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define eps 1e-9
#define LL long long
#define MX 5005 int n,k;
int dat[MX];
LL dp[MX][];
LL pre[MX][]; int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
dp[][]=, pre[][]=;
for (int i=;i<=n;i++)
{
scanf("%d",dat+i);
pre[i][]=;
dp[i][]=;
}
LL ans =;
for (int j=;j<=k;j++)
{
for (int i=;i<=n;i++)
{
dp[i][j&] = max(dp[i-][j&],pre[i-][(j-)&])+dat[i];
pre[i][j&] = max(pre[i-][j&],dp[i][j&]);
}
ans = max(ans,pre[n][j&]);
}
printf("%lld\n",ans);
}
return ;
}

 

 
 

1052 最大M子段和(DP)的更多相关文章

  1. 环形数组 最大子段和 dp

    题目链接:https://nanti.jisuanke.com/t/36118 环形数组的连续最大子段和,有两种情况. 1.最大和的这个子段没有包含头尾.所以直接dp[i] = max(dp[i-1] ...

  2. 51nod 1052 最大M子段和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1052 题意: 思路:设$dp[i][j]$表示前j个数构成i个字段时的最 ...

  3. 51nod 1051 最大子矩阵和 【最大子段和DP变形/降维】

    [题目]: 一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如:*3的矩阵: - - - - 和最大的子矩阵是: - - Input 第1行:M和N, ...

  4. luogu P1115 最大子段和 (dp)

    链接: https://www.luogu.org/problemnew/show/P1115 题面: 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一 ...

  5. P1121 环状最大两段子段和(DP)

    P1121 环状最大两段子段和 难度 提高+/省选- 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件 ...

  6. 51Nod 1050 循环数组最大子段和 | DP

    Input示例 6 -2 11 -4 13 -5 -2 Output示例 20 分析: 有两种可能,第一种为正常从[1 - n]序列中的最大子字段和:第二种为数组的total_sum - ([1-n] ...

  7. hdu1003 dp(最大子段和)

    题意:给出一列数,求其中的最大子段和以及该子段的开头和结尾位置. 因为刚学过DP没几天,所以还会这题,我开了一个 dp[100002][2],其中 dp[i][0] 记录以 i 为结尾的最大子段的和, ...

  8. Codeforces 1155 D Beautiful Array DP,最大子段和

    题意 给出一个长度为\(n\)的数列和数字\(x\),经过最多一次操作将数列的一个子段的每个元素变为\(a[i]*x\),使该数列的最大子段和最大 分析 将这个数列分为3段考虑,第一段和第三段是未修改 ...

  9. [DP]洛谷P1115最大子段和

    题目来源 https://www.luogu.org/problemnew/show/P1115 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一 ...

随机推荐

  1. hibernate学习系列-----(7)hibernate对集合属性的操作之List集合篇

    今天要写的内容其实不多,本打算将hibernate对集合的操作的内容直接归结为一篇的,但想一想,还是分开写的比较好,毕竟前面的已经发布出去来了,废话不多说,开始吧! 依旧新建一个StudentList ...

  2. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-可以用软件自带NC工具驱动但是程序无法让电机转动怎么办

    新建一个项目,当扫描的时候务必勾选YES,使用网上最新的XML文件   如果不使用,则有些设备可能被扫描出来是无效的(图标不正常)   如果完全删除XML描述文件,可能也能扫描出来,而且可以用Twin ...

  3. 打造你爱不释手的编辑器sublime3

    首先去官网下载你的sublime3 让后安装好package control 去package control官网 安装好package control 安装emmet,和格式化工具 接着安装一个好主 ...

  4. 网络编程基础——学习阻塞,非阻塞(select和epoll)

    <h3 class="xyn" helvetica="" neue',="" helvetica,="" aria ...

  5. Crontab命令--Linux

    Crontab命令--定时任务   命令格式 Example:  

  6. python exec和eval

    exec语句用来执行储存在字符串或文件中的Python语句.例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句.下面是一个简单的例子. >>> ...

  7. RapidIOIP核的验证方法研究_王玉欢

    RapidIOIP核的验证方法研究_王玉欢 https://wenku.baidu.com/view/0fd3c925d4d8d15abf234e73.html

  8. 【转载】Js获取当前日期时间及其它操作

    var myDate = new Date();myDate.getYear();        //获取当前年份(2位)myDate.getFullYear();    //获取完整的年份(4位,1 ...

  9. 查看zookeeper是否启动

    查看进程: 方法: ps -aux | grep 'zookeeper' 系统有返回,说明zookeeper启动. 你可以搜索ps -aux.

  10. 分分钟学会一门语言之Python篇

    转自:http://www.code123.cc/1049.html Python 是 90 年代初由 Guido Van Rossum 创立的.它是当前最流行的程序语言之一.它那纯净的语法令我一见倾 ...