PAT 最大子段和——动态规划

PAT 1007 最大子段和——动态规划

当时上课学dp时的一道例题,最优子结构是以第j个(含)结束的子段中和最大的那个(刁钻),记为b[j],则b[j] = max(b[j-1]+a[j],a[j])。

注意这里最大和有可能是负的,所以maxtmp初始化要为负数而不是0,第五个测试点就是这样。

代码:

#include<cstdio>
#include<string>
#include<algorithm>
#include<iostream>

using namespace std;

const int maxn = 100005;
#define INF 0x3f3f3f

int a[maxn],b[maxn],c[maxn];
int K = 0;

int main(){
    cin>>K;
    bool flg = false;
    for(int i = 0;i < K;i++){
        cin>>a[i];
        if(a[i] >= 0) flg = true;
    }
    b[0] = a[0];
    c[0] = 0;
    int maxtmp = -INF,res = 0;
    for(int i = 1;i < K;i++){
        b[i] = max(a[i],b[i-1]+a[i]);
        c[i] = a[i]>b[i-1]+a[i]?i:c[i-1];
        //cout<<b[i]<<" "<<c[i]<<endl;
        if(maxtmp < b[i] || (maxtmp == b[i] && c[i] < c[res])){
            maxtmp = b[i];
            res = i;
        }
    }
    if(flg)
        cout<<b[res]<<" "<<a[c[res]]<<" "<<a[res];
    else
        cout<<0<<" "<<a[0]<<" "<<a[K-1];
}

6ms

上一篇:如何用Autojs写自己的卡密验证界面?实战代码


下一篇:微信小程序-漂亮的搜索框【样式】