大意:一个环,每个点都有一个值,问最长非负子序列。。
思路:dp,如果从上一个点能到达现在的点,dp[i]=dp[i-1]+1,如果dp[i]〉=0的话,从i走到i+1的话肯定能使i+1走更远,所以肯定比直接从i+1走更优。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
int dp[maxn*2];
int nn[maxn];
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
nn[i]=nn[i+n]=a-b;
}
int mon=0,st=1,ans=-1;
for(int i=1;i<=2*n;i++){
if(mon+nn[i]>=0&&mon>=0){
dp[i] = dp[i-1]+1;
mon+=nn[i];
if(i-st+1==n){
ans = n;
break;
}
}
else{
dp[i] = 1;
ans = max(ans,i-st);
st = i;
mon = nn[i];
}
}
cout<<ans<<endl;
}
return 0;
}