C++ 關於最大連續子序列(和最大)問題
/*
江偉浚
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17458 Accepted Submission(s): 7701
Problem Description
給定K個整數的序列{ N1, N2, ..., NK },其任意連續子序列可表示為{ Ni, Ni+1, ...,
Nj },其中 1 <= i <= j <= K。最大連續子序列是所有連續子序列中元素和最大的一個,
例如給定序列{ -2, 11, -4, 13, -5, -2 },其最大連續子序列為{ 11, -4, 13 },最大和
為20。
在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加一個要求,即還需要輸出該
子序列的第一個和最後一個元素。
Input
測試輸入包含若干測試用例,每個測試用例佔2行,第1行給出正整數K( < 10000 ),第2行給出K個整數,中間用空格分隔。當K為0時,輸入結束,該用例不被處理。
Output
對每個測試用例,在1行裡輸出最大和、最大連續子序列的第一個和最後一個元
素,中間用空格分隔。如果最大連續子序列不唯一,則輸出序號i和j最小的那個(如輸入樣例的第2、3組)。若所有K個元素都是負數,則定義其最大和為0,輸出整個序列的首尾元素。
Sample Input
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
Sample Output
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0 (最後一組資料有誤)
*/
#include <iostream>
using namespace std;
int main()
{
int a[200] = {0}; // 陣列a記錄整數序列
// count記錄負數個數
// max 最大和 max_f 最大和最前端 max_l最大和最後端
int n, i, j, s, count, max, max_f, max_l;
// 以輸入作為迴圈條件實現多組資料的輸入
while(cin>>n) {
if( n == 0 ) return 0;
// 特殊情況的判斷
count = 0 ;
for( i = 0; i < n; ++i ) {
cin>>a[i];
if( a[i] < 0 ) count++; //記錄負數個數
}
if(count == n) {
max = 0;
max_f = a[0];
max_l = a[n-1];
}
// 大多數情況的操作
else {
max = a[0];max_f = a[0 ];max_l = a[0];
for( i = 0; i < n; ++i ) {
//從a[0]開始計算各情況
s = a[i];
// 演算法 可草稿推演
for( j = i+1; j < n; ++j ) {
s += a[j];
//尋找最大
if(s>max) {
max = s;
max_f = a[i];
max_l = a[j];
}
}
}
}
// 輸出結果
cout<<max<<" "<<max_f<<" "<<max_l<<endl;
}
return 0;
}
相關推薦
C++ 關於最大連續子序列(和最大)問題
/* 江偉浚 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17458 Accept
最大連續子序列和/最長不下降子序列/最長公共子序列/最長迴文子串
//最大連續子序列和 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 10010; int A[maxn],dp[maxn]; int main(){ int
(4)C語言——求最大連續子序列和
log spa clas 最大連續子序列和 alloc 最大 code max 連續 題目: 輸入一組整數,求出這組數字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那個序列。例如: 序列:-2 11 -4 13 -5 -2,則最大子序列和為20。 序列:-
最大連續子序列和
運行時 介紹 最大連續子序列和 () vector 運行 n) else 連續子序列和 下面介紹一個線性的算法,這個算法是許多聰明算法的典型:運行時間是明顯的,但是正確性則很不明顯(不容易理解)。 //線性的算法O(N) long maxSubSum4(const vec
動態規劃——最大連續子序列和
最大連續子序列和問題如下: 下面介紹動態規劃的做法,複雜度為 O(n)。 步驟 1:令狀態 dp[i] 表示以 A[i] 作為末尾的連續序列的最大和(這裡是說 A[i] 必須作為連續序列的末尾)。 步驟
hdoj1003+codeup2086:Max Sum最大連續子序列和問題解法大總結
目錄 hdoj 1003求解方法 暴力求解O(n^3)/O(n^2)(不推薦,很可能會超時) 分治法(比較複雜,掌握思想即可) 遍歷求和法O(n) dp動態規劃(強推) codeup2086的求解方法 dp求解 hdoj 1003求解方法 暴力求解
最大連續子序列和可能的最優解
問題描述: 給定一個整數序列,a0, a1, a2, …… , an(項可以為負數),求其中最大的子序列和。如果所有整數都是負數,那麼最大子序列和為0; 解決這個問題的演算法有很多種,比如兩重迴圈的暴力破解,或者利用分治的思想,但是還有一種線性時間複雜度的演算法:線上處理,可以比較好的解決這
dp經典問題-最大連續子序列和 hdu1003
題目描述: 這道題我先後做過三遍,結果每一遍都沒有做出來。今天再仔仔細細的研究了一下,才發現用動態規劃更好理解。 關於求最大連續子序列和的博文轉載如下:https://www.cnblogs.com/coderJiebao/p/Algorithmofnotes27.html 最大連續子序列和的特點就
dp經典問題-最大連續子序列和 hdu1003
i++ 最長子序列和 cnblogs ++ n) 代碼 str .com 個數 題目描述: 這道題我先後做過三遍,結果每一遍都沒有做出來。今天再仔仔細細的研究了一下,才發現用動態規劃更好理解。 關於求最大連續子序列和的博文轉載如下:https://www.cnblogs.
Python語言描述最大連續子序列和
1.問題描述 假設有一陣列(python裡為list啦)[1,3,-3,4,-6,-1],求陣列中最大連續子序列的和。例如在此陣列中,最大連續子序列的和為5,即1+3+(-3)+4 = 5 2.O(n2)的解法 最簡單粗暴的方式,雙層迴圈,用一個maxsum標識最大連續子序列和。然後
PAT甲級 最大連續子序列和
目前PAT甲級中涉及Dijkstra的題目有如下幾題: 最大連續子序列和提供兩種寫法: 1.動態規劃: int a[maxn],dp[maxn];//a[i]存放序列,dp[i]存放以a[i]結尾的連續序列的最大和 dp[0]=a[0]; for(int i=1;i&l
[POJ1050]To the Max (矩陣,最大連續子序列和)
資料弱,暴力過 題意 N^N的矩陣,求最大子矩陣和 思路 懸線?不需要。暴力+字首和過 程式碼 //poj1050 //n^4暴力 #include<algorithm> #include<cstdio> #include<cstring>
hdoj Max Sum 最大連續子序列和問題
這個題目是最大連續子序列和的擴充套件,在此基礎上加了起始點和終止點。 (1)終止點的確定,就是每當更新一次Max的值時,更新一下終止點。 (2)起始點的確定,當Thissum<0時,給一個暫時起始點的標記,然後當Max的值更新時,將起始點的值一起更新。 程式
動態規劃(三)最長遞增子序列LIS、最大連續子序列和、最大連續子序列乘積
最長遞增子序列LIS 問題 給定一個長度為N的陣列,找出一個最長的單調自增子序列(不一定連續,但是順序不能亂)。例如:給定一個長度為6的陣列A{5, 6, 7, 1, 2, 8},則其最長的單調遞增子序列為{5,6,7,8},長度為4. 最長遞增子序列
最大連續子序列和:遞迴和動態規劃
問題描述: 給定一個整數序列,a0, a1, a2, …… , an(項可以為負數),求其中最大的子序列和。如果所有整數都是負數,那麼最大子序列和為0; 方法一: 用了三層迴圈,因為要找到這個子序列,肯定是需要起點和終點的,所以第一層迴圈確定起點,第二層迴圈確定終點,第三層
最大連續子序列和:動態規劃經典題目(2)
問題描述: 連續子序列最大和,其實就是求一個序列中連續的子序列中元素和最大的那個。 比如例如給定序列: { -2, 11, -4, 13, -5, -2 } 其最大連續子序列為{
1007 Maximum Subsequence Sum(25 分)【最大連續子序列和】
題意:求最大連續子序列和並記錄該序列的頭尾元素 #include <bits/stdc++.h> using namespace std; int N; int main() { cin>>N; vector<int>
LeetCode#53暨最大連續子序列和問題
這是一道很有意思的演算法題。說它有意思包含了幾個方面的內容:首先,它的直觀上的求解顯而易見、非常容易,但是它的優化求解直到上世紀八十年代才被發現;其次,很多演算法書籍(例如《演算法導論》、《程式設計珠璣
“最大連續子序列和”、“最大遞增子序列”、“最大公共子序列”、“最長公共子串”問題總結
一、最大連續子序列和(最大子序列) 最大子序列是要找出由陣列成的一維陣列中和最大的連續子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,達到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。 思路:只要前i項的和還沒有小
動態規劃dp經典題目:最大連續子序列和
最大連續子序列和問題 給定k個整數的序列{N1,N2,...,Nk },其任意連續子序列可表示為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k。最大連續子序列是所有連續子序中元素和最大的一個,例如給