給出一段序列,選出其中連續且非空的一段使得這段和最大。
input:
第一行是乙個正整數n(n <= 200000),表示了序列的長度。
第接下來的n行包含n個絕對值不大於10000的整數a[i],描述了這段序列。
output:
僅包括1個整數,為最大的子段和是多少。子段的最小長度為1。
sample input:
2 -4 3 -1 2 -4 3
sample output:
#includeusing namespace std;
int a[200001];
int main(void)
printf("%d\n",max);
return 0;
}
給定k個整數的序列,其任意連續子串行可表示為,其中 1 <= i <= j <= k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和為20。現在增加乙個要求,即還需要輸出該子串行的第乙個和最後乙個元素。
測試輸入包含若干測試用例,每個測試用例佔2行,第1行給出正整數k( k< 10000 ),第2行給出k個整數,中間用空格分隔。當k為0時,輸入結束,該用例不被處理。
對每個測試用例,在1行裡輸出最大和、最大連續子串行的第乙個和最後乙個元素,中間用空格分隔。如果最大連續子串行不唯一,則輸出序號i和j最小的那個(如輸入樣例的第2、3組)。若所有k個元素都是負數,則定義其最大和為0,輸出整個序列的首尾元素。
6
-2 11 -4 13 -5 -2
10-10 1 2 3 4 -5 -23 3 7 -21
65 -8 3 2 5 0110
3-1 -5 -2
3-1 0 -2
0
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0
說明:雖然ac但可能不太優雅。另外此題可以暴力求解。
#include#include#define min 0x3f3f3f3f
using namespace std;
int dp[10001];
int a[10001];
int main(void)
int max = 0;
int start=1;
int startindex=1,endindex=1;
dp[1]=a[1];
bool flag=false;
for(int i=1;i<=n;i++)
if(dp[i]>max)
} if(!flag) cout思路:對於
//最大子矩陣和
//經驗教訓
//i,j盡量留給陣列下標
//盡量用實際含義來命名變數
#include#include#include#define min 0x80000000
using namespace std;
int arr[101][101];
int total[101];
int n,m,size;
int maxarraysum(int a,int n)
return max;
} int main(void)
} printf("%d\n",ans);
} return 0;
}
延伸閱讀【模板】動態規劃之揹包問題(01揹包、多重揹包、完全揹包) (郵票、piggy-bank題解)
【模板】動態規劃之最長上公升子串行lis問題、概率dp問題 (烟花題解)
【模板】動態規劃之基本思想、最長公共子串行lcs問題 (coincidence題解)
【模板】動態規劃之最大欄位和、最大子矩陣問題
動態規劃之最大子段和問題
問題描述 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。當所有整數均為負值時定義其最大子段和為0。依此定義,所求的最優值為 例如,當 a1,a2 a3 a4 a5 a6 2,11,4,13,5,2 時,最大子段和為 11 4 13 20 1 最大子段和問題的簡單演算...
動態規劃之最大子段和問題
有一由n個整數組成的序列a 求該序列如 a i a i 1 a j 的子段和的最大值。如果序列中全部是負數則最大子段和為0,依此定義,所求的最優值max,1 i j n。輸入 n 序列的長度 序列值輸出 最大子段和 例如 輸入 6 2,11,4,13,5,2 輸出 20演算法可通過動態規劃求解 我們...
動態規劃之最大子段和問題
問題描述 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。當所有整數均為負值時定義其最大子段和為0。依此定義,所求的最優值為 例如,當 a1,a2 a3 a4 a5 a6 2,11,4,13,5,2 時,最大子段和為 11 4 13 20 1 最大子段和問題的簡單演算...