2 solutions

  • 4
    @ 2024-4-13 11:50:51
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010;
    int f[N],g[N],a[N]; 
    //f[i]表示以a[i]结尾的最长上升子序列,g[i]表示从a[i]开始下降的下降子序列(也就是从后往前上升的子序列) 
    int main()
    {
    	int T;
    	cin>>T;
    	while(T--)
    	{
    		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[i]>a[j])
    				{
    					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[i]>a[j])
    				{
    					g[i]=max(g[i],g[j]+1);
    				}
    		
    			}
    		}
    	
    		int res=0;
    		for(int i=1;i<=n;i++)
    		{
    			res=max(res,max(g[i],f[i]));  //选择一个方向进行运动 
    		}
    		cout<<res<<endl;
    	}
    	return 0;
    }
    
  • -1
    @ 2024-7-8 14:51:33
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010;
    int f[N];
    char g[N],a[N];
    int main()
    {
    	int t;
    	cin>>t;
    	while(f[t]--)
    	{
    		int n;
    		cin>>n;
    		for(int i=1;i<=n;i++)
    		{
    			cin>>a[j];
    		}
    		for(int i=1;i<=n;i++)
    		{
    			f[i]=1;
    			for(int j=1;j<i;j++)
    			{
    				if(f[i]<f[n])
    				{
    					f[i]=max(f[i],f[j*i]+1);
    				}
    			}
    		}
    		for(int i=n;i>=1;i--)
    		{
    			g[i]=1;
    			for(int j=i;j>=0;j--)
    			{
    				if(a[i]<a[j])
    				{
    					g[i]=min(g[i],g[j]);
    				}
    			}
    		}
    		int res=1;
    		for(int i=1;i<=n;i++)
    		{
    			res=min(res,min(g[i],f[i]))+g[i]+f[i],a[i];
    		}
    		cout<<res<<" ";
    	}
    	return 0;
    }
    
    
  • 1

Information

ID
976
Time
1000ms
Memory
256MiB
Difficulty
5
Tags
(None)
# Submissions
44
Accepted
13
Uploaded By