Maximum Subsequence Sum[PAT1007][PTA01-复杂度2]——动态规划

Maximum Subsequence Sum

《Maximum Subsequence Sum[PAT1007][PTA01-复杂度2]——动态规划》

思路

数据结构视频里面简单的讲了一下动态规划的方法,但这个题还需要输出开始最后的序列数,测试点中包含了全是负数、0和负数、最大子序列中含有负数、有不止一个最大子序列、最大子序列开头是0、最大子序列末尾是0这些情况。一开始想针对每个测试点专门写条件判断输出,感觉这种思路不是很对,后来参考了一下网上的解答,关键是要设置一个临时的开头结尾,判断。

实现

注释掉的一部分是原来错误的方法

#include<iostream>
using namespace std;
int main(){
    int num;
    cin>>num;
    int a[num];
    for(int i=0;i<num;i++) cin>>a[i];
    int thissum=0,maxsum=0;
    int start=0,end=num-1;
    int temp_start=0,temp_end=0;
    //int fin=0,lan=0;
    //int length=0;
    for(int j=0;j<num;j++){
        if(thissum>=0){
            thissum+=a[j];
            temp_end=j; 
        }
        else{
            thissum=a[j];
            temp_start=j;
            temp_end=j;
        }
        if(thissum>maxsum||(thissum==0)&&(end==num-1)){
            //the latter condition only happens when 0 is the start and end is the inital state
            maxsum=thissum;
            start=temp_start;
            end=temp_end;
            //length++;
            //lan=j;
        }
        /* else if(thissum<0){ thissum=0; }*/
    }
    //cout<<length;
    //fin=lan-length+1;
    /* int flag1=0;//negative? int flag2=0;//0? for(int k=0;k<num;k++){ if(a[k]>0) flag1++; if(a[k]==0) flag2++; } if(flag1==0&&flag2==0){ maxsum=0; fin=0; lan=num-1; cout<<maxsum<<' '<<a[fin]<<' '<<a[lan]<<endl; } else if(flag1==0&&flag2>0){ maxsum=0; fin=0; lan=0; cout<<0<<' '<<0<<' '<<0<<endl; } else{ cout<<maxsum<<' '<<a[fin]<<' '<<a[lan]<<endl; }*/ 
    cout<<maxsum<<' '<<a[start]<<' '<<a[end]<<endl;
    return 0;
} 
    原文作者:动态规划
    原文地址: https://blog.csdn.net/u013563008/article/details/51229345
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞