洛谷:P1091 合唱队形(dp,)

题目:

在这里插入图片描述

分析:对每个点求出该点结束上升,开始下降,找最大的即可。

即使用一遍严格单调最长上升,严格单调最长下降即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int m;
int A1[105];
int A2[105];
int D1[105];
int D2[105];
int B1[105];
int B2[105];
int main()
{
 cin>>m;
 for(int i=0;i<m;i++)
 {
  cin>>A1[i];
  A2[m-1-i]=A1[i];
 }
 int ok=1;
 for(int i=1;i<m;i++)
 {
  if(A1[i]>A1[i-1]) continue;
  ok=0;
  break;
 }
 if(ok) {
  cout<<0;
  return 0;
 }
 ok=1;
 for(int i=1;i<m;i++)
 {
  if(A2[i]>A2[i-1]) continue;
  ok=0;
  break;
 }
 if(ok) {
  cout<<0;
  return 0;
 }
 D1[0]=A1[0];//上升 
  D2[0]=A2[0];//下降
 int len1 = 0, len2 = 0;
 for (int i=1; i<m; i++) {  
  if (D1[len1]< A1[i]) 
  {
   D1[++len1] = A1[i]; 
   B1[i]= len1+1;
  }
  else {
   int p1 = lower_bound(D1, D1 + len1, A1[i])-D1;
   D1[p1] = A1[i]; 
   B1[i]=p1+1;
  }
 // cout<<i<<' '<<B1[i]<<endl;
  if (D2[len2] <A2[i])
  {
   D2[++len2] = A2[i]; B2[i]=len2+1;
   }  
  else {
   int p2 = lower_bound(D2, D2 + len2,A2[i]) - D2;
   D2[p2] = A2[i];
   B2[i]=p2+1; 
  }
 // cout<<i<<' '<<B2[i]<<endl;
 }
 int maxx=-1;
 for(int i=1;i<m-1;i++)
 {
  maxx=max(maxx,B2[i]+B1[m-i]);
 }
 cout<<m-maxx+1<<' '<<len1+1<<' '<<len2+1<<endl;
 maxx=min(m-maxx+1,m-max(len1+1,len2+1));
 cout<<maxx;
}

哪儿的细节有问题啊!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/107868111