3 条题解

  • 18
    @ 2023-7-31 16:53:10
    #include <bits/stdc++.h>
    using namespace std;
    int a[1005],n,m=0,b[1005],f[1005];//b保存升序,f保存降序 
    int main()
    {
    	
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];//输入每个人的身高 
    		b[i]=f[i]=1;//默认值都等于1 
    	}
    	for(int i=2;i<=n;i++)//从左往右开始找 
    	{
    		for(int k=1;k<i;k++)//从最左边开始找,找到这个数的前面一个数 
    			if(a[i]>a[k])
    				b[i]=max(b[i],b[k]+1);//比较长度 
    	}
    	for(int i=n-1;i>0;i--)
    	{
    		for(int k=i+1;k<=n;k++)
    			if(a[i]>a[k])
    				f[i]=max(f[i],f[k]+1);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		m=max(m,b[i]+f[i]);
    	}
    	cout<<m-1;
    	return 0;
    }
    
    • 4
      @ 2023-7-23 17:09:13

      以最高点为分界,前面为最长上升子序列,后面为最长下降子序列,而从前往后看的上升子序列,就相当于从后往前看的下降子序列。因此可以用用f[i]表示从1到i的最长上升子序列长度,g[i]表示从n到i的最长上升子序列长度,f[i]+g[i]-1即为以i为最高点的最长序列。枚举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);
      }
      for (int i = 1; i <= n; i++)
          ans = max(ans, f[i] + g[i] - 1);
      
      • -10
        @ 2023-8-8 21:35:08

        与峡谷序列相似。

        • @ 2024-6-11 18:56:38

          注意题解,注意注释,注意格式,注意代码,注意思路,请你修改! 务必要修改!!一定要修改!!!(重要事情说三遍)

      • 1

      信息

      ID
      334
      时间
      1000ms
      内存
      128MiB
      难度
      1
      标签
      (无)
      递交数
      406
      已通过
      293
      上传者