1264:【例9.8】合唱队形
http://ybt.ssoier.cn:8088/problem_show.php?pid=1264
题目的实质实际上是一个双向LIS,对于每一个点和最大值进行一个比较,求得最大值。
1 #include2 using namespace std; 3 typedef long long ll; 4 ll n,maxn; 5 const ll N=520; 6 ll dp[N],a[N],len[N],k,dp2[N]; 7 int main() 8 { 9 scanf("%lld",&n); 10 for(int i=1;i<=n;i++) scanf("%lld",&a[i]); 11 k=0; 12 for(int i=1;i<=n;i++) 13 { 14 ll l=0,r=k; 15 while(l<r) 16 { 17 ll mid=l+r+1>>1; 18 if(dp[mid]mid; 19 else r=mid-1; 20 } 21 k=max(k,r+1); 22 len[i]=r+1; 23 dp[r+1]=a[i]; 24 } 25 k=0; 26 for(int i=n;i>=1;i--) 27 { 28 ll l=0,r=k; 29 while(l<r) 30 { 31 ll mid=l+r+1>>1; 32 if(dp2[mid]mid; 33 else r=mid-1; 34 } 35 k=max(k,r+1); 36 maxn=max(maxn,len[i]+r+1); 37 dp2[r+1]=a[i]; 38 } 39 cout< 1<<'\n'; 40 return 0; 41 }