最长递增子序列

    xiaoxiao2021-03-25  138

    Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB Total Submission: 630   Submission Accepted: 249 Description 有n个互不相同的整数a n 若存在一个数列b m 其中对于任何1 < i < m 满足b i < b i+1 且 a bi < a bi+1 则称a bn为a n的一个递增子序列 试求出给定序列的最长递增子序列长度 Input 本题由多组数据组成,以EOF结束 第2N+1行整数n,代表数组长度,1 <= n <= 7000第2N+2行n个整数ai,0 <= ai <=231-1 Output 对于每组数据输出一行结果,代表最长递增序列长度 Sample Input OriginalTransformed 3 1 2 3 10 3 18 7 14 10 12 23 41 16 24 3[EOL]  1[SP]2[SP]3[EOL]  10[EOL]  3[SP]18[SP]7[SP]14[SP]10[SP]12[SP]23[SP]41[SP]16[SP]24[EOF]  Sample Output OriginalTransformed

    36

    对于最长上升子序列,用递归的效率可能比较低,提交的时候爆时间了,用数组可以AC。 #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<iostream> #include<algorithm> #include<queue> #include<stack> //#define DEBUG using namespace std; int a[7005]; int n,best; stack<int>s; void dfs(int i); int main() { #ifdef DEBUG freopen("Text.txt", "r", stdin); #endif // DEBUG while (cin >> n) { int i, j; for (i = 0; i < n; i++) cin >> a[i]; best = 0; dfs(0); cout << best << endl; } return 0; } void dfs(int i) { if (i == n) { if (s.size() > best) best = s.size(); return ; } if (s.empty() || a[i] > s.top()) { s.push(a[i]); dfs(i + 1); s.pop(); } if (s.size() + n - i - 1 > best) dfs(i + 1); } 下面是用数组实现的代码: #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<iostream> #include<algorithm> #include<queue> #include<stack> //#define DEBUG using namespace std; int a[7005],d[7005]; int n,best; int main() { #ifdef DEBUG freopen("Text.txt", "r", stdin); #endif // DEBUG while (cin >> n) { int i, j; for (i = 1; i <= n; i++) cin >> a[i]; best = 0; d[0] = 1; for (i = 1; i <= n; i++) { d[i] = 1; for (j = 1; j <= i; j++) { if (a[j]<a[i] && d[j] + 1>d[i]) d[i] = d[j] + 1; } } for (i = 1; i <= n; i++) if (d[i] > best) best = d[i]; cout << best << endl; } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-7147.html

    最新回复(0)