Maximum sum
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 44476   Accepted: 13796

Description

Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:

Your task is to calculate d(A).

Input

The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input. 
Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case.

Output

Print exactly one line for each test case. The line should contain the integer d(A).

Sample Input

1

10
1 -1 2 2 3 -3 4 -4 5 -5

Sample Output

13

简单的dp题。
首先是dp,就是把大的问题细化为可以立即解决的小问题。 这有点像数列:先确定n=1的情况,再确定n和n-1的关系,即可得出数列的通项公式。 比如该题的寻找最大子序列,当n为1的时候很容易判定,取这唯一的一个值就好了,然后考虑n和n-1的关系。
我们用a[n]来记录每个值,用dp[n]来记录过程。
如果我们想由n-1的情况推出n的情况,我们是不是要知道n-1时前面的最大子序列和? 而且,这个 和 是需要包含a[n-1]这个值的,否则a[n]无法和前面的序列相连。

思考之后我们可以的出,如果前面包含a[n-1]的最大子序列和,即dp[n-1],大于零,则我们可以得出:dp[n]=dp[n-1]+a[n] ,否则,dp[n]=a[n], 大于零就加上,有点贪心的感jio。
也因此,dp[]中是存在负数的,因为我们要保证 dp[n-1] 至少要包含 a[n-1],否则无法相连,而且最大子序列 长度不能为0. 但此时dp[] 是最终答案了吗?
明显不是,因为 “最大子序列” 不要求每个dp[n-1]中包含a[n-1]。
但也已经接近尾声了。
我们可以知道,不管“最大子序列”在哪里结束,反正在 dp[n]前面的n-1 项中肯定存在,所以要求到dp[n]的最长子序列,只需从头到尾遍历更新一遍: for(int i=1;i<n;i++)
  if( dp[i-1] > dp[i] )
    dp[i]=dp[i-1] 用l(左)数组和r(右)数组记录。 好了,这样子左右分别来一遍后,我们分别得到了 l[]和r[] 两个数组,其中 l[t] 代表 【1,t】(闭区间)内的最大子序列和,r[t]则代表【t,n】的。 而对于这题我们只需从1到n遍历一遍间断点相加 r[] 和 l[] 的值即可得到最大值。
for(int i=1;i<n;i++)
{
  ans= max ( ans , l[i-1]+r[i])
}
得出答案answer。
有几个注意点:
1 一个测试点n是最大值50000,所以需要开大一点的数组,我因为这个找了半天错= =。
2 间断点本身只能取一次,被左或右取均可。 贴一个网址,poj题目推荐
https://www.cnblogs.com/rainydays/p/3671118.html 类似题目,poj2593 代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=50009;
const int minn=-50000; int main()
{
// freopen("input.txt","r",stdin);
int T,n,ans;
int a[maxn],ls[2][maxn],rs[2][maxn];
cin>>T;
while(T--)
{
ans=minn;
cin>>n;
ls[0][0]=ls[1][0]=minn;rs[0][n+1]=rs[1][n+1]=minn;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ls[0][i]=max(ls[0][i-1]+a[i],a[i]);
ls[1][i]=max(ls[0][i],ls[1][i-1]);
}
for(int i=n;i>=1;i--)
{
rs[0][i]=max(rs[0][i+1]+a[i],a[i]);
rs[1][i]=max(rs[0][i],rs[1][i+1]);
} for(int i=2;i<=n;i++)
{
ans=max(ans,ls[1][i-1]+rs[1][i]);
}
cout<<ans<<endl;
}
}

  

最长子序列dp poj2479 题解的更多相关文章

  1. HDU 4123 (2011 Asia FZU contest)(树形DP + 维护最长子序列)(bfs + 尺取法)

    题意:告诉一张带权图,不存在环,存下每个点能够到的最大的距离,就是一个长度为n的序列,然后求出最大值-最小值不大于Q的最长子序列的长度. 做法1:两步,第一步是根据图计算出这个序列,大姐头用了树形DP ...

  2. nyoj17-单调递增最长子序列-(dp)

    17-单调递增最长子序列 内存限制:64MB 时间限制:3000ms 特判: No通过数:125 提交数:259 难度:4 题目描述: 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列 ...

  3. 动态规划:ZOJ1074-最大和子矩阵 DP(最长子序列的升级版)

    To the Max Time Limit:1 Second     Memory Limit:32768 KB Problem Given a two-dimensional array of po ...

  4. 最长子序列(线性DP)学习笔记

    子序列和子串不一样.子串要求必须连续,而子序列不需要连续. 比如说\(\{a_1,a_2\dots a_n\}\),他的子串就是\(\{a_i,a_{i+1},\dots, a_j|1\leq i\l ...

  5. 求最长子序列(非连续)的STL方法 - 洛谷P1020 [NOIP1999 普及组] 导弹拦截

    先给出例题:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 大佬题解:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 ...

  6. HDU 1513 最长子序列

    Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. 【LCS,LIS】最长公共子序列、单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  8. nyoj 17 单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  9. NYOJ17,单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf.长度为4 输入 第 ...

随机推荐

  1. DevExpress GridView 整理(转)

    DevExpress GridView 那些事儿 1:去除 GridView 头上的 "Drag a column header here to group by that column&q ...

  2. Java_集合面试题

    Java_集合面试题 0.链表,队列和栈的区别? 链表是一种存储结构,指得是存储时候除了要存储数据元素之外,还要用数据元素一起的另外空间存储数据元素的关系. 队列和栈都是线性表,属于逻辑结构范畴,都是 ...

  3. WebApi 序列化 循环引用问题

    public static void Register(HttpConfiguration config) { // Web API 配置和服务 config.Formatters.Remove(co ...

  4. 浏览器调试动态js脚本

    前两天拉取公司前端代码修改,发现在开发者工具的sources选项里边,居然没有列出来我要调试的js脚本,后来观察了一下,脚本是动态在页面里引入的,可能是因为这样所以不显示出来,但是如果不能断点调试,只 ...

  5. SpringCloud和Springboot

    SpringBoot+SpringCloud+SpringMVC+SpringData 我们把这种架构也称之为spring全家桶 什么是SpringCloudSpring Cloud是一系列框架的有序 ...

  6. 20165312 2017-2018-2《JAVA程序设计》第8周学习总结

    20165312 2017-2018-2<JAVA程序设计>第8周学习总结 一.第十二章知识点总结 进程与线程 进程是程序的一次动态执行进程,它对应了从代码加载.执行至执行完毕的一个完整过 ...

  7. Quartz入门及简单实现

    Quartz简介 Quartz是一个功能丰富的开源作业调度库,可以集成到几乎任何Java应用程序中 - 从最小的独立应用程序到最大的电子商务系统.Quartz可以用来创建执行数十,数百乃至数万个作业的 ...

  8. 谷歌浏览器内核Cef js代码整理(一)

    尊重作者原创,未经作者允许不得转载!作者:xtfnpgy,原文地址: https://www.cnblogs.com/xtfnpgy/p/9285359.html 一.js基础知识 <!--   ...

  9. 笔记本 原来win10系统改装win7系统遇到 invaid signature detected.check secure boot policy setup问题

    这次操作的笔记本电脑是   华硕R414U 大家如果遇到类似问题的话也可以参考这个方法,但是必须搞清楚电脑的型号,型号不同操作起来有差别的 我这里选择的重装系统的方法是最简单粗暴的硬盘安装方法,怎么硬 ...

  10. 消息对话框 MessageBoxButtons

    消息对话框MessageBox经常用于向用户显示通知信息.例如,在操作过程中遇到错误或程序异常,经常会使用这种方式给用户以提示,它是特殊类型的对话框. 在C#中,MessageBox消息对话框位于Sy ...