1 solutions
-
0
可以直接遍历i前面所有的数
#include <iostream> #include <cmath> #include <iomanip> #define int long long #define endl '\n' #define QAQ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; const int N=1e5+5; int a[N],dp[N]; void solve() { int n,maxx=-1e9; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; dp[i]=1; for(int j=1;j<i;j++)//挨个遍历前面的数字查找 { if(a[j]<=a[i])//求不下降,即>= dp[i]=max(dp[i],dp[j]+1); } maxx=max(maxx,dp[i]); } cout<<maxx; } signed main() { QAQ; int t=1; // cin>>t; while(t--) solve(); return 0; }
当然也可以直接二分找到前面最大的<=我们的第i个数
#include <iostream> #include <cmath> #include <algorithm> #define QAQ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); const int N=10005; using namespace std; int n,h[N],dp1[N],cnt=0;//dp1记录最后一个不下降的数,cnt记录数量 int find(int l,int r,int x)//用二分查找从左找到dp1中第一个大于x的数 { while(l<r) { int mid=(l+r)/2; if(dp1[mid]>x) r=mid; else l=mid+1; } return l; } int main(){ QAQ; //求最长不下降子序列 cin>>n; dp1[0]=-1e9; for(int i=1;i<=n;i++) { cin>>h[i]; if(h[i]>=dp1[cnt])//如果不下降,则记录dp1; { dp1[++cnt]=h[i]; // cout<<cnt<<' '; } else { int j=find(1,cnt,h[i]); dp1[j]=h[i]; // cout<<j<<'|'; } } cout<<cnt; return 0; }
很显然我们第一种方法五百多ms,而第二种9ms。 (我直接copy paste的不知道什么时候写的代码())
- 1
Information
- ID
- 1130
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 7
- Tags
- # Submissions
- 24
- Accepted
- 9
- Uploaded By