對網上最大欄位和dp解法建模的勘誤

2021-06-05 18:20:45 字數 867 閱讀 7266

設有array[1~n],求最大欄位和。

而網上的說法是b[j]是array[1~j]的最大字段區間。如果這是子問題,那麼當j=n,則b[j]就是最終結果,顯然不是這樣,不然sum變數是做什麼的呢,何況b[n]也沒被用來做最終結果。

實際上這個問題的線性解法描述應該是這樣的。

有一串數字,程式從頭依次逐個地讀取。

(1)若這個數是負數,則捨棄繼續往下讀。

(2)如果是正數,則從這個數開始與後面的數累加,直到小於0,則整體可看做乙個負數,捨棄繼續往下讀。

設變數max,每個(1)過程取max(這個負數,max),每個(2)過程取x次max(sum,max)即取max(sum峰值,max)

這也應該算一種規律吧。

public int maxsubarray(int n,int a)

return sum;

}

poj 1050

#include#includeusing namespace std;

int n;

int a[101][101];

int b[101][101];

//int res[101][101];

int res;

int sum;

int main()

} memset(b,0,sizeof(b));

//memset(res,-10000,sizeof(res));

res=-10000;

for(int i=0;i0)else

//res[j][k]=max(res[j][k],b[j][k]);

res=max(res,b[j][k]);

}} }

cout<

最大欄位和(dp)

設a i dp i 我們在選擇乙個元素a j 的時候,只有兩種情況,將a i 至a j 1 加上,或者從a j 以j為起點開始。我們用乙個陣列dp i 表示以i為結束的最大子段和,對於每乙個a i 加上dp i 1 成為子段,或以a i 開始成為新段的起點。因為我們只需要記錄dp值,所以複雜度是o ...

最大欄位和小結 DP

詳情可以看這裡的講解,很詳細 poj2479 模板題,即求兩個段的最大子段和 poj2479 dp i j 表示包含第i個數的前i個數劃分為j個子段和的最大值 dp i j max j 1 k include define inf 10000000 using namespace std int d...

關於最大欄位和的若干解法和優化

最大欄位和是常見的乙個入門演算法問題,根據演算法的優化程度,這裡分為了四種方法 第一種 複雜度為o n 2 兩個用於語句巢狀 int summax 1 int a,int tem if temp maxj temp maxi temp maxi temp maxj return temp maxi ...