HDU 1003 【DP之最大连续子序和】

来源:互联网 发布:网上电脑软件培训 编辑:程序博客网 时间:2024/06/05 00:11

机智的方法就是走一步判断一步,

sum=0,开始逐个加;

因为题中不是上升,所以只是某一段,

故如果sum为负数了,就改为0,从当前段继续向后遍历;

这里的小技巧就是输出case,用for循环可以很随意的搞定这个;


#include <bits/stdc++.h>using namespace std ;int n ,dp[100000+10],j; int first,last,temp,sum;int main(){int t ;cin>>t;for(j=1;j<=t;j++){memset(dp,0,sizeof(dp));cin>>n;for(int i = 0 ; i < n ; i++){cin>>dp[i];}sum=0;int maxsum = -100000;first=last=0;temp=1;for(int i = 0 ; i < n ; i++){sum+=dp[i];if(sum>maxsum){maxsum=sum;first=temp;//*这就是开始last=i+1;//last坐标为目前最后一个坐标}if(sum<0){sum=0;temp=i+2;//*最后一位不符合的后一位;} } printf("Case %d:\n%d %d %d\n",j,maxsum,first,last);          if (j!=t)          {              printf("\n");          }      }  return 0; }


0 0
原创粉丝点击