1、动态规划解法
两个关键:
①、无后效性的状态;
②、状态转移方程
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=10010;
int A[maxn];
int dp[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
//边界
dp[0]=A[0];
for(int i=1;i<n;i++)
{
//状态转移方程
dp[i]=max(A[i],A[i]+dp[i-1]);
}
int k=0; //存放下标
for(int i=1;i<n;i++)
{
if(dp[i]>dp[k])
{
k=i;
}
}
printf("%d\n",dp[k]);
return 0;
}
2、暴力解法
#include<cstdio>
using namespace std;
int a[6]={-2,11,-4,13,-5,-2};
int sum(int i,int j)
{
int ans=0;
for(int k=i;k<=j;k++)
{
ans+=a[k];
}
return ans;
}
int main()
{
int max=-2;
for(int i=0;i<6;i++)
{
for(int j=i;j<6;j++)
{
int s=sum(i,j);
if(s>max) max=s;
}
}
printf("%d",max);
return 0;
}