最大字串和問題 個人剖析

2021-06-21 13:08:49 字數 1346 閱讀 7246

input: int a[1..n], with positive and negative integers

output: the max sum of continuous integers, if all negative, return 0;

o(n^3):(具體計算見最下面)

max=0;

for starti=1->n

for leni=1->n-starti+1

sum=0;

for j=starti->starti+leni-1

sum+=a[j];

endif(maxmax=sum;

endend

o(n^2):

max=0

for starti=1->n

sum=0;

for leni=1->n-starti+1

sum+=a[starti+leni-1];

if(maxmax=sum;

endend

o(n):dp

雖然之前上課學過,但是也知道用dp效率最高,但是今天再次寫遞推方程的時候還是會卡殼。

b[j]:a[1..j]中包含a[j]的最大欄位和

b[j]=max;   2<=j<=n

=a[j]                     j=1

(這裡最容易忘記的一點是b[j]是表示包含a[j]的子問題最優解,而不是原始問題的子問題最優解。做完之後,再遍歷一遍b[j]就可以求解最大值了)

1.遞推的時候,判斷b[j-1],>0 加上a[j],<0 賦上a[j],而且每次只許儲存當前b[j],之前的1..j-1都不需要,因為已經把之前b[1..j-1]的最大用乙個max記錄下來了。

2.最後的遍歷b[j]求最大,又可以優化,因為b[j]問題的最後解是從1->n遞推過去的時候逐步儲存的,並且始終記錄當前最大即可

int b=0,max=0;

for j=1->n

if b>0

b+=a[j];

else

b=a[j];

endif maxmax=b;

endend

這個演算法經典在於:

本來dp需要儲存b[1..n] 然後最後再遍歷一遍求最大。但是可以用乙個b儲存,而且還省去最後遍歷求最大的過程,這兩步優化是同時進行的。

今天刷leetcode居然發現還犯了遍歷b[j]來找maxsum的問題。。悲劇啊,都寫過的東西。而且發現其實可以處理最大和為負數的情況,而不需要返回乙個0

附屬**:

int maxsubarray(int a, int n) /2

=/2//most important 技巧!!!!

=/2=/2

=o(n^3)

最大字串和

最大字串和 include using namespace std 求最大字串和 返回最大和 int maxsubsum int a,int len else temp a i if temp sum 如果區域性最大值大於全域性最大值則更新 sum temp return sum 求最大字串和 返回...

公共最大字串長度

無題 要求輸出最大公共字串長度和執行次數。將來還要輸出,最大字串。輸入案例 7 6abcbdab bdcaba 4 4abcd abcd 4 5abcd acbcc 輸出答案 寫的很笨,先記著怎麼寫等用到時在仔細研究吧 基本思路就是這個表 有斜槓的表示加一的操作。my answer include ...

將字串B插入字串A中最大字元前面

include include 編寫乙個c語言函式,insert函式功能是將字串b插入字串a中最大字元前面 void insert int main void insert char s1,char s2 m strchr s1,max s1 串1開頭到最大值間的距離 位址 strchr char ...