hdu1231 最大连续子序列

来源:互联网 发布:阿里云oss 七牛 编辑:程序博客网 时间:2024/05/18 11:49

注:其实hdu1003和hdu1231这题其实是一样的,这里咱就偷个懒了啊!!大笑


这个是自己写的大家可以看看!!

<span style="font-size:18px;">#include<iostream>using namespace std;int a[10001];int main(){int k;while(cin>>k && k){int i,Max=-99999999,first=0,last=0,sum=0,x=0;bool flag=false;for(i=0;i<k;i++){scanf("%d",&a[i]);if(a[i]>=0)//为了方便处理全为负数的情况flag=true;}if(flag==false){//cout<<"0"<<" "<<a[0]<<" "<<a[k-1]<<endl;printf("%d %d %d\n",0,a[0],a[k-1]);              continue;  }for(i=0;i<k;i++){sum+=a[i];if(Max<sum){first=a[x];last=a[i];Max=sum;}if(sum<0)//如果之前的sum值已经为负数了,我就没必要去的该值了,我只需从后一个数开始就可以了{sum=0;x=i+1;}}printf("%d %d %d\n",Max,first,last);//cout<<Max<<" "<<first<<" "<<last<<endl;}return 0;}</span>

这个我是看来的觉得他这样做也是很方便和容易理解的!!

<span style="font-size:18px;">最大连续子序列,这应该算一道简单的动态规划题,重要的是找状态转移方程,这题的状态转移方程是:if(maxsum[i-1]>=0)maxsum[i]=a[i]+maxsum[i-1];elsemaxsum[i]=a[i];然后想法记录下标就可以了,我是用结构体记录的,方便,参考程序:#include<stdio.h>#include<string.h>struct MAX{int sum,start,end;//记录初始坐标和最大和}max[10001];//结构体数组int main(){int n,d,i,Max,a[10001];while(scanf("%d",&n),n){memset(max,0,sizeof(max));for(i=1;i<=n;i++)scanf("%d",&a[i]);max[1].sum=a[1];//处理第一个max[1].start=1;//记录初始坐标max[1].end=1;for(i=2;i<=n;i++){if(max[i-1].sum>=0){//状态转移方程max[i].sum=max[i-1].sum+a[i];max[i].start=max[i-1].start;//初始坐标不变max[i].end=i;//末坐标为本身}else{max[i].sum=a[i];max[i].start=i;//初始坐标改变max[i].end=i;}}Max=max[1].sum;d=1;for(i=2;i<=n;i++){if(max[i].sum>Max){Max=max[i].sum;d=i;}}if(Max<0){//处理全为负数的情况printf("0 %d %d\n",a[1],a[n]);continue;}printf("%d %d %d\n",Max,a[max[d].start],a[max[d].end]);}return 0;}</span>


0 0