最大子段和 最大子矩陣和

2022-06-29 05:30:12 字數 1745 閱讀 1756

給出n個整數序列(可能為負數)組成的序列a1,a2, ...,an,求該序列形如

的子段和的最大值。當所有整數均為負數時,定義最大子段和為0。

多測試用例。每個測試用例佔2行:

第一行是序列的個數n(0 n ≤ 10000),第二行是n個整數。

為每個測試用例輸出一行結果:最大子段和。

6

-2 11 -4 13 -5 -2

31 2 3

20

6很經典的dp問題,用dp[i]表示前i個數的最大子段和

每次選擇第i個數的時候判斷前i-1個數的最大子段和是否為負,為負則捨去,為正就加上

狀態轉移方程 dp[i]=max(dp[i-1],0)+dp[i]

記錄dp[i]的最大值

#include#include

using

namespace

std;

#define max_data 10000

#define inf 0x3f3f3f3f

inta[max_data];

intdp[max_data];

intmain()

memset(dp,

0,sizeof(dp));//

初始化int ans=-inf;

for(int i=1;i<=n;++i)

cout

}return0;

}

description

給出乙個m×n的矩陣,請輸出它的最大子矩陣和。

input

多測試用例,每個測試用例:

第一行是兩個正整數m和n,表示該矩陣的行數和列數。1 < m, n < 400

接下來m行,每行n個整數,空格分隔。

output

每個測試用例輸出一行:該矩陣的最大子矩陣和。運算結果在int範圍內。

sample input

4 4

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2

sample output

15

用乙個二維陣列儲存每列的字首和,即a[i][j]表示第j列前i行的和

之後就可以轉換為一維的最大子段和問題

#include#include

using

namespace

std;

#define max_data 400

#define inf 0x3f3f3f3f

int a[max_data+2][max_data+2

];int dp[max_data+2][max_data+2

];int

main()

}memset(dp,

0,sizeof(dp));//

初始化int ans=-inf;

for(int i=1;i<=m;++i)}}

cout

}return0;

}

最大子段和與最大子矩陣和

最大子段和。求一段連續的子段裡面最大的值。1 include2 const int maxn 10006 3 inta maxn 45 intmain 614 15for int i 1 i n i 20 printf d n ans 21 22return0 23 最大子矩陣和 求最大子矩陣的和,...

最大子段和

設a 是n個整數的序列,稱為該序列的子串行,其中1 i j n.子串行的元素之和稱為a的子段和.例如,a 2,11,4,13,5,2 那麼它的子段和是 長度為1的子段和 2,11,4,13,5,2 長度為2的子段和 9,7,9,8,7 長度為3的子段和 5,20,4,6 長度為4的子段和 18,15...

最大子段和

問題表述 n個數 可能是負數 組成的序列a1,a2,an.求該序列 例如 序列 2,11,4,13,5,2 最大子段和 11 4 13 20。1 窮舉演算法 o n3 o n2 2 分治法 將序列a 1 n 從n 2處截成兩段 a 1 n 2 a n 2 1 n 例項 三 最大子段和 問題表述 n個...