题目描述

pat 7-1 Maximum Subsequence Sum_#include

解题思路

这是一道很简单的dp题,dp数组dp[i]代表以j结尾的连续序列的最大和,则有dp[i]=dp​​i-1​​,dp[i]=nums[i]+dp​​i-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]);
}