最大子段和问题
问题定义:对于给定序列a1,a2,a3……an,寻找它的某个连续子段,使得其和最大。如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其和为20。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main()
{
int n;
long long a[50005];
//long long dp[50005];
while(scanf("%d",&n)!=-1)
{
for(int i=0; i<n; i++)
{
scanf("%lld",&a[i]);
}
//memset(dp,0,sizeof(dp));
long long ans=0,dp=0;
for (int i=0; i<n; i++)
{
if(dp>0)
dp+=a[i];
else
dp=a[i];
if(dp>ans)
ans=dp;
}
cout<<ans<<endl;
}
return 0;
}
描述
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
15
题目大意就是从大矩阵里找一个小矩阵,这个小矩阵的所有数之和最大;
思路如下:
将子矩阵和转化为子序列和
先第一行,然后第一二行,一二三,一二三四之后二,二三,二三四。。。
具体实现代码如下: