Loading

pat 7-1 Maximum Subsequence Sum

题目描述

解题思路

这是一道很简单的dp题,dp数组dp[i]代表以j结尾的连续序列的最大和,则有dp[i]=dpi-1,dp[i]=nums[i]+dpi-1,再判断一下全负的特殊情况即可。
代码:

#include<iostream>
#include<stdio.h>
using namespace std;
int K;
int* nums;

int main(){
    bool is_negative=true;
    scanf("%d", &K);
    nums=(int*)malloc(K*sizeof(int));
    for(int i=0;i<K;i++){
        cin>>nums[i];
    }
    for(int j=0;j<K;j++){
        if(nums[j]>=0){
            is_negative=false;
            break;
        }
    }
    if(is_negative){
        printf("%d %d %d",0,nums[0],nums[K-1]);
        return 0;
    }
    int* dp=(int *)malloc(K*sizeof(int));
    int* dp_pos=(int *)malloc(K*sizeof(int));
    dp_pos[0]=0;
    dp[0]=nums[0];
    for(int i=1;i<K;i++){
        if(dp[i-1]<0){
            dp[i]=nums[i];
            dp_pos[i]=i;
        }else{
            dp[i]=dp[i-1]+nums[i];
            dp_pos[i]=dp_pos[i-1];
        }
    }
    int max_sum=-1000;
    int max_pos=0;
    for(int k=0;k<K;k++){
        if(max_sum<dp[k]){
            max_sum=dp[k];
            max_pos=k;
        }
    }
    printf("%d %d %d",dp[max_pos],nums[dp_pos[max_pos]],nums[max_pos]);
}
posted @ 2021-10-01 10:56  lh123cha  阅读(45)  评论(0)    收藏  举报