2 条题解
-
3
#include<iostream> using namespace std; const int N=1010; int a[N],f[N],g[N],w[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[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); } int maxn=-1; for(int i=1;i<=n;i++) { w[i]=f[i]+g[i]-1; maxn=max(maxn,w[i]); } cout<<n-maxn; return 0; }
-
0
int check1(int r) { int f[105], ans=0; for (int i = 1; i <= r; i++) { f[i] = 1; for (int j = 1; j < i; j++) if (a[j] < a[i]) f[i] = max(f[i], f[j] + 1); ans = max(ans, f[i]); } return ans;//这个用来求最长上升子序列 } int check2(int l) { int f[105], ans=0; for (int i = l; i <= n; i++) { f[i] = 1; for (int j = l; j < i; j++) if (a[j] > a[i]) f[i] = max(f[i], f[j] + 1); ans = max(ans, f[i]); } return ans;//这个用来求最长下降子序列 } //数据小,不用Onlogn的算法 int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 0; i <= n; i++) { answ = min(answ, n - check1(i) - check2(i)+1);//n - check1(i) - check2(i)+1用来表示以i为峰顶的最长山峰子序列 } cout << answ; return 0; }
- 1
信息
- ID
- 275
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 2
- 标签
- 递交数
- 107
- 已通过
- 66
- 上传者