最大子陣列問題 動態規劃

2021-06-20 02:51:58 字數 1626 閱讀 4599

昨天偶然上csdn,看到這個問題,學習了一種複雜度為o(n)的演算法,可以計算array的最大子陣列問題。思路就是從0-length,將array累加起來,同時用乙個變數max記錄最大值,如果sum > max,就更新max,如果sum < 0 就令sum = 0(為什麼是這樣呢,sum < 0的話,前面的就可以直接捨棄了)。附上**:

#include using namespace std;

void maxsubarray(int array, int len)

//sum < 0的話,就該把前面的拋棄,並且重置sum 為 0, 起始位置為 i + 1

if (sum < 0)

//sum > 0,繼續 (假設最大子陣列在中間 array[i~j]

//因為 array[k~i-1]的和大於0,則array[k~j]顯然是更大的子陣列) 因此 sum > 0時候,繼續

} cout << "start position: " << s_pos << endl;

cout << "end position: " << e_pos << endl;

cout << "max value: " << max << endl;

}int main()

;maxsubarray(a, sizeof(a)/sizeof(int));

system("pause");

return 0;

}

接著又看到一篇動態規劃的最大子陣列問題,看了下,覺得這跟上面的方法就是一樣的,那個dp[i]也不是記錄著dp[0~i]的最大子陣列問題,於是我就想用dp[i]記錄dp[0~i]的最大子陣列問題值,用動態規劃,就是考慮當前的array[i]是不是最大子陣列的一員,如果是要怎麼做,不是要怎麼做,**如下:

#include #define size 9

using namespace std;

void maxsubarray(int array, int dp, int len)

if (sum < 0)

}//sum2>0 && dp[i-1] + sum2 > max,則array[end_position~i]與array[0~i]合併才是當前陣列最大子陣列值

if (sum2 > 0 && dp[i-1]+sum2 > max) else if (dp[i-1] > max) else

} for (int i = 0; i < len; i++)

cout << dp[i] << ' ';

}int main() ;

int dp[size];

maxsubarray(a, dp, size);

system("pause");

return 0;

}

array= ,dp[2] = 38, end_position = 1(最大子陣列的末尾下標, dp[2]表示array[0-2]的子陣列最大值),則dp[3]的求法為,先看看-7+12 是否是大於0的,如果大於0,則18 20 -7 12合併後顯然比dp[2]更大,應該合併,這時也得找出-7 12 這個陣列最大子陣列值,顯然是12,拿12和合併後的比較取較大者,然後更新end_position。繼續迴圈

動態規劃 最大子陣列和問題

有整型陣列int a 求這個陣列的最大子陣列和 來手寫一下求取最大子陣列和序列的過程,用m i 表示第i個數所對應的最大子陣列和 s 0 1 m 0 1 s 1 max 1 m 1 max 1 s 2 max 3 m 2 max 3 s 3 max 13 m 3 max 13 s 4 max 9 m...

動態規劃 最大子陣列

解題思路 對於這樣乙個連續和的問題 個人習慣叫做最大連續和 如果我們要用動態規劃來解,首先得考慮狀態和狀態轉移方程。如果我們把題述陣列看成序列,那麼是不是可以用序列dp來考慮呢?我們不妨考慮乙個這樣的序列 1,3,5,2,4 a i 表示這個序列的第 i 個元素,dp i 表示最後乙個元素是a i ...

最大子陣列問題(動態規劃初級題目)

題目 hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始...