3 条题解
-
18
#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
以最高点为分界,前面为最长上升子序列,后面为最长下降子序列,而从前往后看的上升子序列,就相当于从后往前看的下降子序列。因此可以用用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);
- 1
信息
- ID
- 334
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- (无)
- 递交数
- 406
- 已通过
- 293
- 上传者