最大子序列和问题 hdu1231
生活随笔
收集整理的這篇文章主要介紹了
最大子序列和问题 hdu1231
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最大連續子序列
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34269????Accepted Submission(s): 15539
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思路:很經典的題目,假設現在只有s[0]一個元素,現要添加一個元素s[1],那么s[1]要么是新串的起點,要么是原串暫時的終點。如果之前的串的最大和小于0,那么s[1]的值加上原串之后只會小于s[1]本身,所以索性不加,s[1]自己新開一個串,自己作為起點。如果之前的串的最大和大于等于0,那么s[1]就增加到這個串上,并且暫時成為該串的終點。所以每加入一個元素,要么更新起點,要么更新暫時的終點。可以用一個數組DP[i]來保存以[i]為終點的子串的最大值,每次試圖更新最大值即可。!!!!!記住模板,以后可以用。 代碼:#include<bits/stdc++.h> using namespace std;const int MAXN=100000+10; int dp[MAXN],a[MAXN];int main() {int k,t;while(~scanf("%d",&k)&&k!=0){for(int i=0; i<k; i++)scanf("%d",&a[i]);int max_start = 0,max_end =0, start = 0,maxn;maxn=dp[0]=a[0];for(int i=1; i<k; i++)//模板。{if(dp[i-1]<0&&a[i]!=dp[i-1]){start=i;dp[i]=a[i];}else if(dp[i-1]>=0)dp[i]=dp[i-1]+a[i];if(maxn<dp[i]){maxn=dp[i];max_start=start;max_end=i;}}if(maxn<0)//特殊情況的判斷,不同題目不同。{maxn=0;max_start=0;max_end=k-1;}//printf("Case %d:\n",cas);printf("%d %d %d\n",maxn,a[max_start],a[max_end]);}return 0; }
總結
以上是生活随笔為你收集整理的最大子序列和问题 hdu1231的全部內容,希望文章能夠幫你解決所遇到的問題。