題目鏈結->link
給定乙個整數序列,其中有正有負,求其最長子序列的和,以及該子串行對應的首、尾元素,如果序列全為負數,那麼則輸出和為0,以及整個序列的首、尾元素。
#include "cstdio"
#include "iostream"
using namespace std;
int main(
)else
if(maxsum(maxsum<0)
maxsum=0;
printf(
"%d %d %d\n"
,maxsum,a[leftindex]
,a[rightindex]);
return0;
}
如果暴力法求所有子串行和再比較,需要o(n2)。
如果用分治法,遞迴思想,從中間分成兩個子串行,遞迴地求左子串行最大長度和右子串行最大長度,以及跨越中間線的最大子串行和,三者中最大的即所求,需要o(nlog2n)。
PAT A1007(動態規劃)
include include include include includeusing namespace std define maxn 100010 int dp maxn a maxn int s maxn int main if flag 1 dp 0 a 0 for int i 1 ia...
PAT A1007 最大連續子串行和
給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大連續子串行和即為20。輸出最大和以及n i n j 如果有多種方案使得和最大,那麼輸出其中i,j 最小的一組 如果所有整數均為負數,則最大子串行和...
動態規劃之最長回文串
dp i j 表示 以s i 開始s j 結尾的回文串的長度。如果這個字串不是回文串,讓dp i j 0 顯然,j i,只需往dp填j i的部分即可。dp i j 的遞推公式可以這麼表述 1 首先對dp的對角線元素初始化為1,也就是當i j時,dp i j 1。這很顯然,每個單獨的字元其實就是個長度...