2 solutions
-
1
#include<bits/stdc++.h> using namespace std; const int N=1010; int f[N],a[N],g[N]; //f[i]=k 表示以a[i]结尾的最长不下降序列长度为k //g[i]=j 表示以a[i]结尾的最长不下降序列长度为k需要接在a[j]的后面 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[i]>=a[j]&&f[i]<f[j]+1) //合法的新的序列比已有的序列长 { f[i]=f[j]+1; g[i]=j; } } } int maxv=0,index; //找到最长不下降序列的长度和结尾的位置 for(int i=1;i<=n;i++) { if(f[i]>maxv) { maxv=f[i]; index=i; } } cout<<"max="<<maxv<<endl; //输出长度 stack<int> stk; //倒推整个序列 while(index) { stk.push(a[index]); //储存当前数 index=g[index]; //得到前面的数的位置 } while(stk.size()) //顺着输出 { cout<<stk.top()<<" "; stk.pop(); } return 0; }
-
-2
#include<bits/stdc++.h> using namespace std; const int N=1010; int f[N],a[N],g[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[i]>=a[j]&&f[i]<f[j]+1) { f[i]=f[j]+1; g[i]=j; } } } int maxv=0,index; for(int i=1;i<=n;i++) { if(f[i]>maxv) { maxv=f[i]; index=i; } } cout<<"max="<<maxv<<endl; stack<int> stk; while(index) { stk.push(a[index]); index=g[index]; } while(stk.size()) { cout<<stk.top()<<" "; stk.pop(); } return 0; }
- 1
Information
- ID
- 980
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- (None)
- # Submissions
- 27
- Accepted
- 9
- Uploaded By