您的位置:首页 > 其它

HDU 1422 重温世界杯 解题报告

2011-04-06 11:22 274 查看
重温世界杯
问题模型

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

解题报告

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

//线性时间求解最长连续子序列长度(要求:连续子序列和不能为负值)
#include<iostream>
#include<cstdio>
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: