题意:最大子段和
思路:见博客的链接
注意:犯很低级的错误,找一个数组的最大值的时候wa啦一次!
#include <iostream>
#include<cstring>
#define MAX 10010
int a[MAX],dp[MAX];
using namespace std;
int main()
{
int n,i,m;
while(cin >> n&&n)
{
memset(dp,0,sizeof(dp));
m=0;
for(i=1; i<=n; i++)
cin >> a[i];
for(i=1; i<=n; i++)
{
dp[i+1]=a[i]+max(dp[i],0);
if(dp[i+1]>m) m=dp[i+1];
}
if(m>0) cout << "The maximum winning streak is " << m << "." << endl;
else cout << "Losing streak." << endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define ll long long
ll a[1000010],dp[1000010];
inline ll maxs(ll a,ll b){return a>b?a:b;}
using namespace std;
int main()
{
int n,i;
ll m;
while(scanf("%d",&n)!=EOF)
{
for(i=1; i<=n; i++)
cin >> a[i];
m=dp[1]=a[1];
for(i=2;i<=n;i++)
{
dp[i]=maxs(a[i]+dp[i-1],a[i]);
if(dp[i]>m) m=dp[i];
}
cout << m << endl;
}
return 0;
}
也可以用分治的思想。。。
- 在[1, n/2]这个区域内
- 在[n/2+1, n]这个区域内
- 起点位于[1,n/2],终点位于[n/2+1,n]内
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define ll long long
ll a[1000010];
using namespace std;
ll maxsum(int l,int r)
{
int i,center;
ll l_sum,r_sum,sum=0,l_temp,s1,r_temp,s2;
if(l==r) sum=a[l];
else
{
center=(l+r)/2;
l_sum=maxsum(l,center);
r_sum=maxsum(center+1,r);
s1=l_temp=a[center],s2=r_temp=a[center+1];
for(i=center-1;i>=l;i--)
{
l_temp+=a[i];
if(l_temp>s1) s1=l_temp;
}
for(i=center+2;i<=r;i++)
{
r_temp+=a[i];
if(r_temp>s2) s2=r_temp;
}
sum=s1+s2;
if(l_sum>sum) sum=l_sum;
if(r_sum>sum) sum=r_sum;
}
return sum;
}
int main()
{
int n,i;
ll m;
while(scanf("%d",&n)!=EOF)
{
for(i=1; i<=n; i++)
cin >> a[i];
cout << maxsum(1,n) << endl;
}
return 0;
}