DP動態規劃 最大數字子串

2021-06-08 10:57:41 字數 2647 閱讀 5455

最大數字子串

time limit: 1500 ms    memory limit:10000 kb  

judge type: multi-cases

total submit :

1215

(245 users)   accepted submit :

397 (209 users)   page view : 6115

font style:

aaaa

aa輸入n(1<=n<=1e6)和n個整數,這n個整數的絕對值均小於1000,求最大數字子串之和。

input

輸入為多組樣例資料,每組第一行為乙個正整數n,第二行為n個整數組成的數字串。

output

對於每組樣例,輸出僅為一行,表示最大數字子串的各項之和。

sample input

9

-3 4 9 2 -10 -7 11 3 -8

13

-1 2 6 -3 5 -7 14 -5 -15 1 8 -4 9

sample output

15

17

hint

在第一組中,最大的數字子串是4 9 2的和

在第二組中,最大的數字子串是2 6 -3 5 -7 14的和

方法:

-3   4  9   2   -10  -7   11   3   -8

記錄方法:

-3  4   13  15  5     -7    11  14  6

把當前的最大和(含當前末尾的最大和)記錄下來,雖然不能直接得出最大和是多少,但可以進行遍歷搜尋最大值即可!

v關鍵是要對負數處理好,看例二,最大子串含有負數。

-12 6 -3 5 -7 14 -5 -15 1 8 -4 9

-12 8

如果在此處斷開記錄

-3,那麼前面的2,

6兩個正數就和後邊斷開了,實際上

2+6+(-3

)>0

,如果後邊是正數的話,完全可以加上這

3個數(比如後邊的

5)-12 8 5 10

相同處理:

-1 2 8 5 10 317 12

後面是

-15,加上

12(前面的子串能形成的最大和)也小於

0,所以此處應該斷開了!記錄

-15!

最後

-1 2 8 5 10 3 1712 -15 1 8 4 13

v輸入陣列

a[i],

用陣列s[i]

記錄最後乙個數為

a[i]

時的最大子串和

v狀態轉移方程為

vs[i] = max(s[i-1]+a[i],a[i]); 1<=i

v初始條件

s[0]=a[0]

v然後

s[i]

中最大元素即為所求。

ac**:

#includeint a, s;

int main()

{ int i,n,num;

while(~scanf("%d",&n))

{ scanf("%d",&s);

num=s;

for(i=1;i

tle**:

#includeint a[2000000],s[2000000];

int main()

{ int i,n,num; //num記錄最大值

動態規劃 最大數列

最大數列 sequence.pas c cpp 問題描述 有乙個n項的數列a1,a2 an ai 10000,1 i n s定義為 你的任務是求s的值,即為求乙個序列的兩個不相交子串行的最大和。輸入檔案 輸入檔案sequence.in的第一行是乙個整數n 2 n 100000 表示數列的項數。第二行...

最大數串問題

設有n個正整數,將他們連線成一排,組成乙個最大的多位數。如 n 3時,3個整數13,312,343,連線成的最大整數為34331213。如 n 4時,4個整數7,13,4,246連線成最大整數為7424613。有多組測試樣例,每組測試樣例包含兩行,第一行為乙個整數n n 100 第二行包含n個數 每...

最大回文子串 (動態規劃)

建立乙個布林型的二維陣列dp,其中dp i j 表示字串第i到j是否為回文。那麼邊界值其實很清楚了,字串長度為1的都為true。狀態轉換如何設定呢?當字串i所在的字元 字串j所在的字元,且它的內部 dp i 1 j 1 為回文,那麼dp i j 為true 又或者當字串i所在的字元 字串j所在的字元...