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 ...