和最大子序列---动态规划

问题描述

  对于一个给定的长度为N的整数序列A,它的“子序列”的定义是:A中非空的一段连续的元素(整数)。你要完成的任务是,在所有可能的子序列中,找到一个子序列,该子序列中所有元素的和是最大的(跟其他所有子序列相比)。程序要求你输出这个最大值。

输入格式

  输入文件的第一行包含一个整数N,第二行包含N个整数,表示A。

  其中

  1 <= N <= 100000

  -10000 <= A[i] <=  10000

输出格式

  输出仅包含一个整数,表示你算出的答案。

样例输入

53 -2 3 -5 4

样例输出

4

这题我觉得有两种解法, 一种是模拟+贪心,一种是动态规划,

对于第一种,我认为代码量比较大,所以我选择第二种方法来解决这题

其实这题的状态转移方程很好确定,就是d[i] = max(d[i - 1] + a[i], 0);

d[i]代表第i个位置最大连续子序列的和,a[i]代表第i个位置的值

一层循环就够了,非常简单

#include <stdio.h>
#include <algorithm>
using namespace std;

int a[100005];
int d[100005];

int main(){
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++){
		scanf("%d", &a[i]);
	}

	int maxn = 0;

	for (int i = 1; i <= n; i++){
		d[i] = max(d[i - 1] + a[i], 0);
		if (d[i] > maxn)
			maxn = d[i];
	}
	printf("%d\n", maxn);
	return 0;
}
时间: 2024-11-04 15:21:20

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

最长公共子序列---动态规划

一: 作用 最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法,作为码农,此算法是我们的必备基本功. 二:概念 举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个,比如其中的cb,cgs等等都是其子序列,我们可以看出 子序列不见得一定是连续的,连续的那是子串. 我想大家已经了解了子序列的概念,那现在可以延伸到两个字符串了,那么大家能够看出:cnblogs和belong的公共子序列吗? 在你找出的公共子序列中,你能找出最长的公共子序列吗? 从图中我们看到了最长公共

ACM试题 - 最长公共子序列 - 动态规划方法

ACM试题题源-(最长公共子序列):http://acm.nyist.net/JudgeOnline/problem.php?pid=36 提交代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); int[] len = new int[n]; fo

C++求解汉字字符串的最长公共子序列 动态规划

    近期,我在网上看了一些动态规划求字符串最长公共子序列的代码.可是无一例外都是处理英文字符串,当处理汉字字符串时.常常会出现乱码或者不对的情况. 我对代码进行了改动.使用wchar_t类型存储字符串,可以正确的处理英文字符串和汉字字符串的最长公共子序列. 代码例如以下: #include "stdafx.h" #include <iostream> #define N 1000 using namespace std; //str1存储字符串1,str2存储字符串2

最长单调递增子序列——动态规划

题目描述: 给定一个序列X[0···n],找出它的最长的单调递增子序列(Longest Increasing Subsequence) 解题思路: 使用动态规划方法. 对于i= 1, 2, --,n,考虑以xi作为最后项的最长递增子序列的长度C[i]. 如果在xi项前面存在xj < xi , 那么 C[i] = max{C[j]} +1:否则,C[i] = 1. 因此, C[i] = max{C[j]} + 1, 存在j,1<=j<i, xj<xi C[i] = 1, 所有j,1&

最长公共子序列--动态规划入门

求两个序列 X{1,2, 5, 4, ...}和Y{1, 5, 4,,,,}中最长的共有序列. 例如X = {A,B, C, B,D, A, B}, Y={B,D,C,A,B,A} 两者的最长公共子序列为 {B,C,B, A} 分析: 这个问题是否可以分成一段一段处理呢? (即可否找出递归结构, 可见递归很重要, 也许你感觉它很基础,其实它很深奥!).我们从X,Y的最后一个元素来考虑, 若X的最后一个元素在最长子串中(即它对最长子串有贡献), 那么有两种情况, 它和Y的最后一个元素相同, 或它与

最长公共子序列--动态规划算法

考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bn-1”,并Z=“z0,z1,…,zk-1”为它们的最长公共子序列.不难证明有以下性质: (1) 如果am-1=bn-1,则zk-1=am-1=bn-1,且“z0,z1,…,zk-2”是“a0,a1,…,am-2”和“b0,b1,…,bn-2”的一个最长公共子序列: (2) 如果am-1!=bn-1,则若zk-1!=am-1,蕴涵“z0,z1,…,zk-1”是“a0,a1,…,am-2”和“b0,

最长递增子序列-动态规划(引用编程之美)

测试用例: 输入:1,-1,2,-3,4,-5,6,-7 输出:4 1 int lis(int array[]){ 2 int n=sizeof(array); 3 //定义lisMax存放当前的最长递增序列 4 int nMax=1; 5 //list[i]中放着从array[0]到array[i]找到的最长递增序列的长度,初始化都为1 6 int* list=new int[n]; 7 for(int i=0;i<n;i++) 8 list[i]=1; 9 //长度为i的递增子序列最大元素的

hdu 1231最大连续子序列 动态规划

动态转移方程dp[i]=max(dp[i-1]+a[i],a[i]); dp[i]表示一这个点结尾的最大连续子序列 因为还要记录序列的头和尾,用start[]记录每个点在该序列的起始位置 注意提示要用scanf啊,cin会TLE /************************************************************************* > File Name: hdu1231.cpp > Author: yang > Mail:[email pr

【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1

非常简单的DP 如果dp[i,j]表示从0到i 和 从0到j 这两段的相似度, 那么可以知道每个dp[i,j]是由三种状态转化过来的 第一种 当dna1[i]==dna2[j]的时候 dp[i-1,j-1] +  1  长度加1 第二种  否则 从下面两个状态过来那就是 dp[i][j-1] 和 dp[i-1][j]//注意因为是顺序遍历 这两个都已经计算过 取两者最大即可. #include <iostream> #include <cstring> #include <a