最大數字子串
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所在的字元...