最長欄位和
陣列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 ...