1. 程式人生 > >和最大子序列---動態規劃

和最大子序列---動態規劃

問題描述  對於一個給定的長度為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;
}

推薦一個公眾號,不吐槽,不毒舌,偶爾發發文章,偶爾推薦好物,歡迎關注或者有女票的程式狗們推薦給女票



相關推薦

大子序列---動態規劃

問題描述  對於一個給定的長度為N的整數序列A,它的“子序列”的定義是:A中非空的一段連續的元素(整數)。你要完成的任務是,在所有可能的子序列中,找到一個子序列,該子序列中所有元素的和是最大的(跟其他所有子序列相比)。程式要求你輸出這個最大值。輸入格式  輸入檔案的第一行包含

動態規劃求解大公共子串大子序列問題

一.簡單的介紹動態規劃一般用於求最優子結構問題,求全域性的解,可以通過求區域性的最優解,漸進的達到全域性的最優解。最大公共子串 表示的是字串str1 和字串str2 之間存在重複的部分,但是重複的字串一定要是連續的,不能間斷。最大公共子序列表示的是字串str1 和字串str2

LeetCode-53. 大子-簡單的動態規劃(Python3)

題目連結: 53.最大子序和 題目描述: 給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列&n

nyoj 17-單調遞增長子序列(動態規劃,演算法)

clear ron queue orange 處理 描述 clas mes math 17-單調遞增最長子序列 內存限制:64MB 時間限制:3000ms Special Jud

[藍橋杯][演算法提高VIP]大子序列 (Java版)

題目:對於一個給定的長度為N的整數序列A,它的“子序列”的定義是:A中非空的一段連續的元素(整數)。你要完成的任務是,在所有可能的子序列中,找到一個子序列,該子序列中所有元素的和是最大的(跟其他所有子序列相比)。程式要求你輸出這個最大值。 我們的校賽選了這道題,

nyist oj 17 單調遞增長子序列 (動態規劃經典題)

單調遞增最長子序列 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述求一個字串的最長遞增子序列的長度 如:dabdbf最長遞增子序列就是abdf,長度為4

HDU acm 1003 Max Sum || 動態規劃大子序列詳解

line namespace num more sequence mem ould 動態規劃 ger Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot

基於python的動態規劃經典問題(爬樓梯,取珠寶,大子序列,找零錢)

1,爬樓梯問題 一個人爬樓梯,每次只能爬1個或兩個臺階,假設有n個臺階,那麼這個人有多少種不同的爬樓梯方法 動態規劃的狀態轉移:第 i 個狀態的方案數和第 i-1, i-2時候的狀態有關,即:dp[i]=dp[i-1]+dp[i-2],dp表示狀態矩陣。 def climb_stai

大子序列(動態規劃)

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int a[100010];int dp[100010];int max(int x,in

hdu-1231 連續大子序列動態規劃

得到 繼續 用例 using 規劃 mem 空格 編寫 序號 Time limit1000 ms Memory limit32768 kB 給定K個整數的序列{ N1, N2, ..., NK },其任意連續子序列可表示為{ Ni, Ni+1, ..., Nj },其中

31.動態規劃-乘積大子序列-Leetcode 152(python)

題目描述 給定一個整數陣列 nums ,找出一個序列中乘積最大的連續子序列(該序列至少包含一個數)。 示例 示例 1: 輸入: [2,3,-2,4] 輸出: 6 解釋: 子陣列 [2,3] 有最大乘積 6。 示例 2: 輸入: [

大子序列長連續公共子串(連續)、長公共子序列動態規劃

原文連結:http://blog.sina.com.cn/s/blog_54f82cc20100zi4b.html 最大子序列 最大子序列是要找出由陣列成的一維陣列中和最大的連續子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,達到最大;而 {5,-6

POJ-1050 動態規劃大子大子

1、最大子段 由於最大子段不可能以負數或負數段開頭,可以以此得到演算法 int max(int a[],int n) { int sum,maxsum; int i ; sum = maxsum = 0; for(i =

Maximum Subarray連續子序列 -- LeetCode(經典動態規劃

原題連結: http://oj.leetcode.com/problems/maximum-subarray/這是一道非常經典的動態規劃的題目,用到的思路我們在別的動態規劃題目中也很常用,以後我們稱為”區域性最優和全域性最優解法“。基本思路是這樣的,在每一步,我們維護兩個變數,一個是全域性最優,就是到當前元

動態規劃——乘積大子序列

題目連結:http://www.lintcode.com/zh-cn/problem/maximum-product-subarray/ 參考資料:http://blog.csdn.net/wzy_1988/article/details/9319897        

動態規劃--大子序列問題

        給定一長度為N的整數序列(a1,a2,…,aN),將其劃分成多個子序列(此問題中子序列是連續的一段整數),滿足每個子序列中整數的和不大於一個數B,設計一種劃分方法,最小化所有子序列中最大值的和。說明其具有優化子結構及子問題重疊性質        例如: 序列長

leetcode 53 大子序列之和(動態規劃)

array num pan arr turn leet lse 最大 clas 思路:nums為給定的數組,動態規劃: 設 一維數組:dp[i] 表示 以第i個元素為結尾的一段最大子序和。 1)若dp[i-1]小於0,則dp[i]加上前面的任意長度的序列和都會小於n

C++求解漢字字符串的長公共子序列 動態規劃

esp style mes else if c++ char 那種 size 公共子序列 近期,我在網上看了一些動態規劃求字符串最長公共子序列的代碼。可是無一例外都是處理英文字符串,當處理漢字字符串時。常常會出現亂碼或者不對的情況。 我對代碼進行了改動。使用wc

算法入門:大子序列的四種算法(Java)

else 初始化 需要 nbsp ava 時間 pos sub for循環 最近再學習算法和數據結構,推薦一本書:Data structures and Algorithm analysis in Java 3rd 以下的四種算法出自本書 四種最大子序列和的算法: 問題描

大子序列問題

class 輸入數據 bsp sub == order color 解決辦法 可能 問題描述: 給定一整數序列A1, A2,... ,An (可能有負數),求A1~An的一個子序列Ai~Aj,使得Ai到Aj的和最大。 解決辦法: 分治法:最大子序列和可能出現在三個地方:整個