动态规划求最大子序列

动态规划求最大连续子序列:

思想:

1、如果在array[1,N]中存在最大连续子序列array[i,j],那么对于任何的k(i<=k<=j)均有array[i,k]大于0。假设array[i,k]小于0,由条件知array[i,j]为最大连续子序列,且由等式array[i,k](小于0)+array[k+1,j]=array[i,j](最大连续子序列),知array[k+1,j]>arra[i,j],即array[k+1,j]为最大子序列。与已知条件矛盾。

2、因此,我们可以把array[1,N]分割为若干个子串,使得其除去最后一个字符串以外每个子串的和小于0,且对所有子串array[i,j]和任意k(i<=k<=j)均有array[i,j]<0且array[i,k]>0,此时我们要说明的是,满足条件的和最大子串,只能是上述某个子串的前缀,而不可能跨越多个子串。

因此我们得到该类型题的解决方案:

从头到尾遍历扫描数组,将数组分割成若干个子串(除去最后一个子串其余任何子串和小于0),同时也得到每个子串的最大前缀之和,比较得到最大前缀和即为最大连续子序列之和。比如对于数列:{-10 1 2 3 4 -5 -23 3 7 -21} 通过分隔成若干子串得到{-10} {1 2 3 4 -5 -23} {3 7 -21}三个子串,每个子串的最大前缀和为-10 10 10

故最大连续子序列之和为10。

C语言代码:

 1 #include <stdio.h>
 2 int count;
 3 int sum,thisSum;
 4 int main(){
 5     int len;
 6     while(scanf("%d",&len)!=EOF&&len!=0){
 7         //
 8         sum=thisSum=0;
 9         int tmp;
10         while(len--){
11             scanf("%d",&tmp);
12             thisSum+=tmp;
13             if(thisSum<0)
14                 thisSum=0;
15             if(thisSum>sum)
16                 sum=thisSum;
17         }
18         printf("%d\n",sum);
19     }
20     return 0;
21 }
时间: 2024-08-09 21:48:58

动态规划求最大子序列的相关文章

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

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 250714    Accepted Submission(s): 59365 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max su

HDU acm 1003 Max Sum || 动态规划求最大子序列和详解

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 164592    Accepted Submission(s): 38540 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max su

动态规划求最长公共子序列问题

#include<iostream> #include<string> #include<vector> using namespace std; //找两个子串str1,str2的最长公共子串substr void findLongestSubString(string &str1, string &str2, string &substr){ if (str1.empty() || str2.empty()){ return; } //定义二

经典算法之动态规划--求最大公共子序列

作为新人,之前对C,C++了解的比较少,关于算法方面更是一窍不通,但最近却痴迷上了算法,哪怕是前辈们不屑一顾的东东,我弄明白了后都会欣喜若狂! 今天将遇到的问题和java实现贴出来和同为新人的博友分享,老鸟可以可以直接关网页了. 定义: 子序列:一个给定序列的子序列是再该序列中删去若干元素后得到的序列.即:给定{x1,x2,...,xm}和Z={z1,z2,...,zk},X的子序列是指存在一个严格递增下表序列{i1,i2,...ik} 使得对所有的j=1,2,...k,都有zj=xij.例如:

使用分治法求最大子序列之和

对于求最大子序列之和,对于我这样的菜鸟,首先想到的应该是最暴力的方法,就是将所有的子序列的和进行比较,然后出现最大值并返回答案.不过这也没啥意思,复杂度O(N2). 对这个问题,有一个相对复杂的O(NlogN)的解法,就是使用递归.其主要思想是:比较左.右.中间三部分的序列和的大小,因为中间部分是没办法分治的,只能在每一层递归函数空间里面进行,所以递归的部分为左.右,而且左右部分序列和有分别为次层递归的结果.递归的基本边界:左右为相同位置元素,即只有一个元素. 1 private static

[ACM] POJ 2479 Maximum sum (动态规划求不相交的两段子段和的最大值)

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33363   Accepted: 10330 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 o

(hdu step 3.2.1)Max Sum(简单dp:求最大子序列和、起点、终点)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1390 Accepted Submission(s): 542   Problem Descrip

分治策略结合递归思想求最大子序列和

我的主力博客:半亩方塘 对于 <数据结构与算法分析--C语言描述> 一书第 20 页所描述的算法 3,相信会有很多人表示不怎么理解,下面我由具体问题的求解过程出发,谈谈我自己的理解: 首先,什么是分治法呢?所谓 分治法,就是 将一个问题的求解过程分解为两个大小相等的子问题进行求解,如果分解后的子问题本身也可以分解的话,则将这个分解的过程进行下去,直至最后得到的子问题不能再分解为止,最后将子问题的解逐步合并并可能做一些少量的附加工作,得到最后整个问题的解.在求解原来整个问题的算法思想,与求解每一

九度OJ 1042 Coincidence (动态规划求最长公共子序列)

题目1042:Coincidence 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1689 解决:898 题目描述: Find a longest common subsequence of two strings. 输入: First and second line of each input case contain two strings of lowercase character a-z. There are no spaces before, inside or aft