一个数组,找出其中连续的一个子数,使它们的和尽可能大。
如 -2 11 -4 13 -5 -2这5个数中,最大连续子序列和是11-4+13=20。
满足重叠子问题和最优子结构两个条件。即后面的最大值都要用到前面的最大值。
本题比较容易想出递推公式:dp[i] = max(f[i],dp[i-1]+f[i])。
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int f[maxn];
int dp[maxn];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&f[i]);
dp[i] = f[i];
}
int m = dp[0];//m表示最大值,因为已使用max函数,所以不能再命名max
for(int i=1;i<n;i++){
dp[i] = max(f[i],dp[i-1]+f[i]);
if(dp[i]>m) m = dp[i];
}
printf("%d\n",m);
}
return 0;
}