hdu 1231

最大子序列问题,求出最大连续的和:

例如,数列为:a[10]={-10,1,2,3,4,-5,-23,3,7,-21},

j(0,1,2,3,4...9)我们可以把包括a[j](j从0到j)的最大子序列先算出来,例如第一步可以算出

最大值a[0]=-10;

第二步,a[0]=-10;a[1]=1;

第三步,a[0]=-10;a[1]=1;a[2]=3;

第四步,a[0]=-10;a[1]=1;a[2]=3;a[3]=6;

第五步,a[0]=-10;a[1]=1;a[2]=3;a[3]=6;a[4]=10;

第六步...

第七步...

第八步,a[6]=3,a[7]=10;

....

这样的方法算出最大的子序列,求最大连续子序列的第一个和最后一个元
素的问题,则可以用一个二维数组进行标记每一个a[i]的第一个和最后一个元
素,进过比较得到最大的那个。

 

 

#include <stdio.h>
int a[10005],b[10005],c[10005][2];//c[10005][2]分别用来
//记录最开始和最后的下标
int main(){
 int n,i,j,m;//j用来记录最大时的下标
 int sta,end;//分别代表最前面和最后的位标
 while(scanf("%d",&n)==1){
  if(n==0)
   break;
  for(i=0;i<n;i++){
   scanf("%d",&a[i]);
   b[i]=a[i];
  }
  j=0;
  sta=0;
  end=0;
  m=a[0];//
  c[0][0]=sta;
  c[0][1]=end;
  /*for(i=1;i<n;i++){
   if(a[i-1]<=0){
    //j=sta;
    sta=i;
    //c[j++][0]=sta;
   }
   else{
    a[i]+=a[i-1];
   }
   if(a[i]>m){
    end=i;
    m=a[i];
   }
   //if(sta>end)
    //sta=j;
  }*/
  for(i=1;i<n;i++){
   if(a[i-1]<=0){
    c[i][0]=i;
    c[i][1]=i;
   }
   else{
    a[i]+=a[i-1];
    c[i][0]=c[i-1][0];
    c[i][1]=i;
   }
   if(a[i]>m){
    m=a[i];
    j=i;
   }
  }
  //printf("%d\n",j);
  if(m<0)
   printf("0 %d %d\n",b[0],b[n-1]);
  else
   printf("%d %d %d\n",m,b[c[j][0]],b[c[j][1]]);
  //printf("%d\n",a[1]);
  //printf("%d %d\n",sta,end);
  /*for(i=0;i<n;i++){
      printf("%d ",a[i]);
  }
  printf("\n");
  for(i=0;i<n;i++){
      printf("%d ",c[i][0]);
  }
  printf("\n");
  for(i=0;i<n;i++){
      printf("%d ",c[i][1]);
  }
  printf("\n");*/
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值