題目大意:輸入t為總的案例數,每個案例中首先輸入n表示陣列長度,隨後輸入n個數a[1]-a[n]表示乙個陣列,求乙個子陣列,要求這個子陣列所有數加起來和最大,並輸出這個子陣列的起始下標,如果有多個子陣列都是和最大的,則輸出第乙個滿足條件的子陣列的下標。
考慮前n個元素(陣列所有元素),設f[n]為從前n個元素選擇,最大子陣列的和。則求前n個元素的最大子陣列,有兩種情況:1、最大子陣列不包含a[n],此時前n個元素的最大子陣列為前n-1個元素的最大子陣列f[n-1]。2、最大子陣列以a[n]結尾,設g[n]表示以a[n]結尾的最大子陣列的和。以a[n]結尾最大子陣列,要麼是a[n]自己本身,要麼是以a[n-1]結尾的最大子陣列,要麼是a[n]自己,所以確立遞推關係g[n]=max。總的遞推關係:f[n]=max。
這裡還有乙個問題,需要輸出最大子陣列的起始下標,我們引入了兩組變數:tmpstart、tmpend和preleft、preright,兩組變數的定義已經寫在了注釋當中。
#include#include#includeusing namespace std;
//#define debug
void solve(int *left,int *right);
int t;
int n;
int a[100005];
int f[100005],g[100005];
int main()else
if(f[i-1]>=g[i])else
//此時*left,*right為前i個元素最大子串行的起止下標
#ifdef debug
cout<<"i="
preleft=*left;
preright=*right;
}}
HDOJ1003 求最大子列
思路 既然要求乙個數列中最大子列的值。第一種思路 暴力,直接遍歷這個數列,但最大的數列元素個數有10000個,所以肯定超時 所以想到第二種方法 只需要遍歷一遍這個數列。從第乙個數字一直往後加,求和,如果和乙隻在增大,那麼不斷更新最大值和 上限 題目輸出要求中的第三個數字 如果碰到所求和比最大值小了那...
HDOJ 1003 最大子串行和
最開始題目都沒看懂,看了別人的部落格才知道這道題是要求最大子串行和。這裡我先歸納了三種求解最大子串行和問題的演算法,在最後給出該題的ac 直接遍歷所有可能的情況。int maxsubsequence1 int arr,int n return max sum 若將乙個序列從中分為兩半的話,該序列的和...
動態規劃 最大子串 HDOJ1003
題目大意 輸入是具有n個整數的向量x,輸出是輸入向量的任何聯絡子向量中的最大和,並輸出該子向量的開始和結束為止。例如 輸入 5 6 1 5 4 7 7 0 6 1 1 6 7 5 輸出 case 1 14 1 4 case 2 7 1 6 分別有四種方法都能夠求解出來分別是o n 3 和o n 2 ...