給出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#includedescriptionusing
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;
}
給出乙個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#includeusing
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個...