2 solutions
-
4
#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
#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