DP 动态规划 Problem A 1001 最长子序列

来源:互联网 发布:共享卫士 网络尖兵 编辑:程序博客网 时间:2024/06/06 14:29

Problem A  ID:1001 


简单题意:给出一组含负数的数,求最大子序列,并求出此序列的首尾位置。


解题思路形成过程:从第一个数开始遍历,一直遍历到最后一个。

            除第一个数以外:如果以前一个数为尾的最大子序列(设为cmax[i-1])大于等于0,则以当前这个数(设为a[i])为结尾的最大子序列为cmax[i]=cmax[i-1]+a[i];反之,如果cmax[i-1]<0,则cmax[i]=a[i]

            用另一个数组来储存以每个数为结尾时,最大子序列的起始位置。

            找出其中的最大值,输出i的位置,以及相对应的子序列的起始位置。


感想:这道题的输出格式很容易出现错误,最后一组数据输出后不输出回车也会PE。

    细节上出现了一点小问题,导致一种情况会出现错误(比如所有数都是相同的负数时)。

    代码最起码在逻辑上一定要足够完美。如果出现了WA,就想想还有那种情况出现在了考虑之外,多想几种样例来试一下。


代码:
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int a[2000001];int cmax[2000001];int tag[2000001];int main(){   // freopen("1.txt","r",stdin);    int n,p=1;    cin>>n;    while(n--)    {        int num,tmax,ttag;        scanf("%d",&num);        for(int i=0;i<num;++i){            scanf("%d",&a[i]);            if(i==0){                cmax[0]=a[0];                tag[0]=0;                tmax=a[0];                ttag=0;            }            else{                if(cmax[i-1]>=0){                    cmax[i]=a[i]+cmax[i-1];                    tag[i]=tag[i-1];                }                else{                    cmax[i]=a[i];                    tag[i]=i;                }                if(cmax[i]>tmax){                    tmax=cmax[i];                    ttag=i;                }            }        }        printf("Case %d:\n",p++);        printf("%d %d %d",tmax,tag[ttag]+1,ttag+1);        if(n!=0)            printf("\n\n");        else            printf("\n");    }}

0 0
原创粉丝点击