题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024

题意就是有n个数分成m段,求最大的和;

dp[i][j]表示把 j 个数分成 i 段,选择第 j 个数的结果,而并不是当前的最优解,

那么要考虑的是第i个数的数是自己成一段还是和前面的成一段

所以dp[i][j]=max(dp[i][j-1]+a[j], Max+a[j]); 其中Max为前 j-1 个数字分成 i-1 段中的最大值;

由于题中n为100w,m不知道是多少,所以开二维数组可能不行因为只有每个状态就只和它的前一个状态有关,所以我们可以用dp【2】【N】来实现滚动数组;

异或^是相同为0,不同为1,可以用^1来转换状态;

本题要考虑边界问题;

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define N 1000050
#define MOD 1000000007
#define met(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f
typedef long long LL; int n, m, dp[][N], a[N]; int main()
{
while(scanf("%d %d", &m, &n)!=EOF)
{
met(dp, );
met(a, ); for(int i=; i<=n; i++)
scanf("%d", &a[i]); int Max, ans, k; k = ; for(int i=; i<=m; i++)
{
k = k^; dp[k][i] = dp[k^][i-]+a[i];///选择第i个数,分成i段,所以只能自己成一段,那么只能这样写; Max = dp[k^][i-]; ans = dp[k][i]; for(int j=i+; j<=n; j++)///j要从i+1开始是因为:要分成i段至少要有i个数,还有就是下面有个j-1;
{
Max = max(Max, dp[k^][j-]);///Max为前j-1个数分成i-1段中的最大值; dp[k][j] = max(Max + a[j], dp[k][j-] + a[j]); ///自己成一段(Max);和前面的成一段(dp[i][j-1]); ans = max(dp[k][j], ans);
}
} printf("%d\n", ans);
}
return ;
}

Max Sum Plus Plus---hdu1024(动态规划求M段的最大和)的更多相关文章

  1. HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. HDU 1024 Max Sum Plus Plus (动态规划)

    HDU 1024 Max Sum Plus Plus (动态规划) Description Now I think you have got an AC in Ignatius.L's "M ...

  3. 【题解】最大 M 子段和 Max Sum Plus Plus [Hdu1024] [51nod1052]

    [题解]最大 M 子段和 Max Sum Plus Plus [Hdu1024] [51nod1052] 传送门:最大 \(M\) 子段和 \(Max\) \(Sum\) \(Plus\) \(Plu ...

  4. HDU 1024 Max Sum Plus Plus (动态规划、最大m子段和)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. HDU 1003 Max Sum【动态规划求最大子序列和详解 】

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  7. Max Sum Plus Plus (动态规划) HDU1024

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1024 (http://www.fjutacm.com/Problem.jsp?pid=1375) 题意 ...

  8. HDOJ-1003 Max Sum(最大连续子段 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=100 ...

  9. hdu1024 Max Sum Plus Plus 滚动dp

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. Shell 启动java程序

    #!/bin/sh SHELL_PATH=$(cd ")";pwd) echo $SHELL_PATH cd "$SHELL_PATH" CLASSPATH=. ...

  2. c :函数指针具体解释

    在研究opencv源码的过程中.处处可见到函数指针,于是翻出来谭浩强的<C程序设计>把函数指针这一块内容再补一补! 1 定义 数据类型 (*指针变量名)(參数表); 注: 数据类型是指的函 ...

  3. UIView的背景渐变

    //绘制背景渐变 /* CGCradientCreateWithColorComponents函数需要四个参数: 色彩空间:(Color Space)这是一个色彩范围的容器,类型必须是CGColorS ...

  4. Loadrunner 9.5_webservice(SOAP)性能测试

    WebService定义:Webservice是一种新的使用基于XML标准和协议来交换信息的WEB应用程序.是基于SOAP(简单对象访问协议)消息的应该协议,只是为WEB页面或可执行程序提供编程接口. ...

  5. 调用外部 DLL 中的函数(2. 晚绑定)

    , b, t, );end; procedure TForm1.FormDestroy(Sender: TObject);begin  FreeLibrary(inst);  {记得释放}end; e ...

  6. linux shell判断脚本执行时传入了多少个参数,判断脚本参数个数,参数数量

    需求描述: 在写shell脚本的时候,会有这样的需求,脚本在执行的过程中是需要传入参数的,如果没有参数传递给脚本, 就会给出相应的脚本使用方法或者例子,告知,脚本后面应该加什么样的参数.所以呢,这里要 ...

  7. Java精选笔记_会话技术

    会话及其会话技术 会话概述 指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程. 会话:从浏览器开启到浏览器关闭.会话技术:用来保存在会话期间 浏览器和服务器所产生的数据. 在 ...

  8. HTML表单的应用

    <html> <head> <title>HTML表单的应用</title> </head> <body> <!-- bo ...

  9. POJ 1742 Coins(多重背包, 单调队列)

    Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...

  10. /etc/hosts

    /etc/hosts 是 Linux 系统中一个负责IP地址与域名快速解析的文件,解析优先级:DNS缓存 > hosts > DNS服务(/etc/resolv.conf) 文件格式:网络 ...