HDU 1422 重温世界杯 解题报告

重温世界杯

问题模型

      环形序列的最长非负连续子序列。

解题报告

     最大连续子序列问题的变形。定义f[i]表示当旅行到城市i时能够旅行的城市数目。显然当前剩余为 非负时f[i]=f[i-1]+1;否则,f[i]=0;动态地记录已经获得的最优解。

//线性时间求解最长连续子序列长度(要求:连续子序列和不能为负值) #include #include #define Max 200100 using namespace std; int f[Max],a[Max]; int main(){ int n,s,t; while(cin>>n){ for(int i=1;i<=n;i++){ scanf("%d%d",&s,&t); a[i]=s-t; } for(int i=1;i<=n;i++) //预处理,便于操作 a[i+n]=a[i]; int pre=0,cnt=0,s=0; //pre为当前剩余的钱数 cnt记录最优值 s记录每次出发的起点 f[0]=0; for(int i=1;i<=2*n;i++){ if(pre+a[i]>=0){ pre+=a[i]; f[i]=f[i-1]+1; if(i-s==n){ //这里是一个优化 if(f[i]>cnt) cnt=f[i]; break; } } else{ s=i;pre=0;//更新起点和当前剩余钱数 f[i]=0; if(f[i-1]>cnt) cnt=f[i-1];//更新记录最有值 } } printf("%d/n",cnt); } return 0; }

 

你可能感兴趣的:(动态规划,优化)