最長子段和 最大子矩陣

2021-08-19 23:56:43 字數 1369 閱讀 6978

最長欄位和

陣列a[0...n],求出max a[i..j]的和

用dp的思想做 dp[i]表示從a[0]到a[i]的最長子段和,並且肯定包含a[i],則原問題轉換成求max dp

dp[i] = max(dp[i-1]+a[i],a[i])

故若dp[i-1]>0,則dp[i] = dp[i-1]+a[i];若dp[i-1]<0,則dp[i]=a[i];

int maxsum(int a,int n)else

if(newsum > resultsum)

}return resultsum;

}

最大子矩陣

矩陣是二維的,想辦法把二維矩陣壓縮成一維就可以轉換成最長欄位和的問題。

首先考慮行數為1的矩陣,對每行採用最長欄位和

考慮行數為2的矩陣,並且把同一列的元素相加,將二維轉換成一維

....重複

為了避免重複計算,可以引入輔助陣列a[i][j][len]表示第j列,從第i行開始,長度為len的元素的和,

a[i][j][len] = a[i][j][len-1]+source[i+len-1][j] 

故這裡可以去掉最後一維

a[i][j] = a[i][j] + source[i+len-1][j]

#include//思路 最大子段和的動態規劃迭代公式 dp[i]表示dp[0..i]的最長子矩陣,其中肯定包含第i個元素

// dp[i] = max(dp[i-1]+a[i],a[i]) 所以 若dp[i-1] > 0 --dp[i] = dp[i-1]+a[i]; 否則 dp[i] = a[i]

//最大欄位和即為max dp[i]

//最大子矩陣把二維的矩陣壓縮成一維 首先考慮只有一行的子矩陣,在考慮只有兩行的(把兩行的對應位置相加)

using namespace std;

int source[110][110];

int a[110][110];//輔助陣列

int n;

//計算a並且返回最大欄位和

int maxsum(int a,int n)else

if(newsum > resultsum)

}return resultsum;

}int cala(int len)

int tempsum = maxsum(a[i],n);

if(tempsum > maxsum)

}return maxsum;

}int main()

}for(int len = 1; len <= n;len++)

}cout<

最大子段和 最大子矩陣和

給出n個整數序列 可能為負數 組成的序列a1,a2,an,求該序列形如 的子段和的最大值。當所有整數均為負數時,定義最大子段和為0。多測試用例。每個測試用例佔2行 第一行是序列的個數n 0 n 10000 第二行是n個整數。為每個測試用例輸出一行結果 最大子段和。6 2 11 4 13 5 2 31...

最大子段和與最大子矩陣和

最大子段和。求一段連續的子段裡面最大的值。1 include2 const int maxn 10006 3 inta maxn 45 intmain 614 15for int i 1 i n i 20 printf d n ans 21 22return0 23 最大子矩陣和 求最大子矩陣的和,...

最大子段和 子矩陣總結

給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和為20。現在增加乙個要求,即還需要輸出該子串行的第乙個和最後乙個元素。輸入 測試輸入包含若干測試用例,每個測試用例佔2行,第1行給出正整數k ...