2 条题解

  • 3
    @ 2023-5-27 9:15:44
    #include<iostream>
    using namespace std;
    const int N=1010;
    int a[N],f[N],g[N],w[N];
    int main(){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++)
        {
            f[i]=1;
            for(int j=1;j<i;j++)
                if(a[j]<a[i])
                    f[i]=max(f[i],f[j]+1);
        }
        for(int i=n;i>=1;i--)
        {
            g[i]=1;
            for(int j=n;j>i;j--)
                if(a[j]<a[i])
                    g[i]=max(g[i],g[j]+1);
        }
        int maxn=-1;
        for(int i=1;i<=n;i++)
        {
            w[i]=f[i]+g[i]-1;
            maxn=max(maxn,w[i]);
        }
        cout<<n-maxn;
        return 0;
    }
    
    
    • 0
      @ 2023-3-11 19:18:34
      int check1(int r)
      {
          int f[105], ans=0;
          for (int i = 1; i <= r; i++)
          {
              f[i] = 1;
              for (int j = 1; j < i; j++)
                  if (a[j] < a[i])
                      f[i] = max(f[i], f[j] + 1);
              ans = max(ans, f[i]);
          }
          return ans;//这个用来求最长上升子序列
      }
      int check2(int l)
      {
          int f[105], ans=0;
          for (int i = l; i <= n; i++)
          {
              f[i] = 1;
              for (int j = l; j < i; j++)
                  if (a[j] > a[i])
                      f[i] = max(f[i], f[j] + 1);
              ans = max(ans, f[i]);
          }
          return ans;//这个用来求最长下降子序列
      }
      //数据小,不用Onlogn的算法
      int main()
      {
          cin >> n;
          for (int i = 1; i <= n; i++)
              cin >> a[i];
          for (int i = 0; i <= n; i++)
          {
              answ = min(answ, n - check1(i) - check2(i)+1);//n - check1(i) - check2(i)+1用来表示以i为峰顶的最长山峰子序列
          }
              
          cout << answ;
          return 0;
      }
      
      • 1

      信息

      ID
      275
      时间
      1000ms
      内存
      16MiB
      难度
      2
      标签
      递交数
      106
      已通过
      65
      上传者