题解 | 最大序列和

#include <bits/stdc++.h>
using namespace std;

const int N=1000001;

int a[N];

int main(){
    int n;
    memset(a,0,sizeof(a));
    while(cin>>n){
        int b[n];
        for(int i=0;i<n;i++){
            cin>>b[i];
        }
        for(int i=0;i<n;i++){
            if(i==0)a[i]=b[i];
            else a[i]=max(b[i],a[i-1]+b[i]);
        }
        int ans=a[0];
        for(int i=0;i<n;i++){
            ans=max(ans,a[i]);
        }
        cout<<ans<<endl;
    }
}

这一题可能比前面的动态规划问题难想一点,其实我们可以发现,如果要求最大的子序列长度,只需要根据新加入的字段来判断即可,对于一个长度的字段,那么无论如何,他的最大值就是自身,如果有两个呢?多加一个,求和,比较一下就知道当前的新的最大值,假如这个最大值更小了,就不加上左边的这个最大值,标记为当前最大值为自身即可,如果更大了,就标记为加和,如果是三个呢?三个连续的,就可以发现,前面两个的操作不就是两种可能吗,但是无论如何,他已经生成了前面的最大值,我们接着做一样的操作即可,这样,递归函数不就出来了吗,对于动态规划,改成数组的数列推演即可。

全部评论

相关推荐

点赞 评论 收藏
分享
10-14 21:00
门头沟学院 Java
吃花椒的狸猫:这个人说的倒是实话,特别是小公司,一个实习生哪里来的那么多要求
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务