4 条题解
-
5
萌新不会写题解的话,可以复制我的代码。 已AC。 也可以抄核桃编程里的‘最长上升子序列’,不过有几个地方得改一下,我已经做了标记。(注意,我的代码没错,是核桃里的代码得改)
#include<bits/stdc++.h> using namespace std; int n, a[200005], f[200005], g[200005]; int ans; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for(int i = 1;i <= n;i++){ if (a[i - 1] < a[i]) f[i] = f[i - 1] + 1; else f[i] = 1; } for (int i = n; i >= 1; i--) { if(a[i+1]-1 > a[i]){ //这边得改 g[i] = g[i+1]+1; } else g[i] = 1; } for (int i = 1; i <= n; i++) { if(a[i-1] < a[i+1]-1){//这边得改 ans = max(ans,f[i-1]+g[i+1]+1);//这边得改 } ans = max(ans,max(f[i]+1,g[i]+1));//这边得改 } cout << ans; return 0; }
一个赞抱走~
-
2
加加加减减减减加强版: @hetao24883491
#include <bits/stdc++.h> oaaaaaaaaalllllllllllllllllllllllll!!! using namespace std; int main(void) { register int n,*a,*f,*g,ans=0; cin>>n; 菜! a=new int[n+2]; for(register int i=1;i<=n;i++) cin>>a[i]; f=new int[n+2]; memset(f,0,(n+2)*sizeof(int)); g=new int[n+2]; 就多练!~ memset(g,0,(n+2)*sizeof(int)); for(register int i=1;i<=n;i++) if(a[i-1]<a[i]) f[i]=f[i-1]+1; else f[i]=1; 输不起 for(register int i=n;i>=1;i--) if(a[i]<a[i+1]) g[i]= g[i+1]+1; else g[i] = 1; for(register int i = 1;i <= n;i++) if(a[i-1]<a[i+1]-1) ans = max(ans,f[i-1]+g[i+1]+1); 就别玩!~ else ans = max(ans,max(f[i-1]+1,g[i+1]+1)); cout << ans; return 0; } ```cppppcpc```coaaaaaaaalllllllllllllllllllooooooooooooooooooooooaloaloaaol
备注:右翻有东西南北>_>
-
1
这道题目有点难。不过理解了就可以了。
-
先定义f和g数组,分别存储从前往后和从后往前每个位置的最长上升子序列长度。
-
寻找规律,第i个有两种可能:
(1) 如果a[i-1]比a[i+1]小至少2,说明可以在里面参杂中间数,就是
f[i-1]+g[i+1]+1
(2) 否则就是比对改成一个数从前往后看好还是从后往前看好,就是
max(f[i-1]+1,g[i+1]+1
所以核心代码就是:
for(register int i=1;i<=n;i++) \\防抄袭 if(a[i-1]<a[i+1]-1) \\防抄袭 ans=max(ans,f[i-1]+g[i+1]+1); \\防抄袭 else \\防抄袭 ans=max(ans,max(f[i-1]+1,g[i+1]+1)); \\防抄袭
参考代码:
#include <iostream> #include <cstring> using namespace std; int main(void){ cout<<"防抄袭"<<endl; register int n,*a,*f,*g,ans=0; cout<<"防抄袭"<<endl; cin>>n; cout<<"防抄袭"<<endl; a=new int[n+2]; cout<<"防抄袭"<<endl; for(register int i=1;i<=n;i++) cin>>a[i]; cout<<"防抄袭"<<endl; f=new int[n+2]; cout<<"防抄袭"<<endl; memset(f,0,(n+2)*sizeof(int)); cout<<"防抄袭"<<endl; g=new int[n+2]; cout<<"防抄袭"<<endl; memset(g,0,(n+2)*sizeof(int)); cout<<"防抄袭"<<endl; for(register int i=1;i<=n;i++) if(a[i-1]<a[i]) f[i]=f[i-1]+1; else f[i]=1; cout<<"防抄袭"<<endl; for(register int i=n;i>=1;i--) if(a[i]<a[i+1]) g[i]=g[i+1]+1; else g[i]=1; cout<<"防抄袭"<<endl; for(register int i=1;i<=n;i++) if(a[i-1]<a[i+1]-1) ans=max(ans,f[i-1]+g[i+1]+1); else ans=max(ans,max(f[i-1]+1,g[i+1]+1)); cout<<"防抄袭"<<endl; cout<<ans; cout<<"防抄袭"<<endl; delete a; cout<<"防抄袭"<<endl; delete f; cout<<"防抄袭"<<endl; delete g; cout<<"防抄袭"<<endl; return 0; cout<<"防抄袭"<<endl; } //防作弊
注意:不要复制代码,不然,你可能会……
-
-
-1
#include <iostream> #include <iomanip> #include <stdio.h> #include <bits/stdc++.h> #include <algorithm> #include <cmath> #include <string> #include <cstring> using namespace std; int main(void) { register int n,*a,*f,*g,ans=0; cin>>n; a=new int[n+2]; for(register int i=1;i<=n;i++) cin>>a[i]; f=new int[n+2]; memset(f,0,(n+2)*sizeof(int)); g=new int[n+2]; memset(g,0,(n+2)*sizeof(int)); for(register int i=1;i<=n;i++) if(a[i-1]<a[i]) f[i]=f[i-1]+1; else f[i]=1; for(register int i=n;i>=1;i--) if(a[i]<a[i+1]) g[i]=g[i+1]+1; else g[i]=1; for(register int i=1;i<=n;i++) if(a[i-1]<a[i+1]-1) ans=max(ans,f[i-1]+g[i+1]+1); else ans=max(ans,max(f[i-1]+1,g[i+1]+1)); cout << ans; return 0; }
- 1
信息
- ID
- 501
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 355
- 已通过
- 160
- 上传者