springcloud-Eureka註冊中心搭建
阿新 • • 發佈:2021-06-25
二分
求一個序列的最長上升子序列個數。
本程式採用邊讀邊處理 + 二分法。
ll f[maxn], ans = 1; //注意答案個數初始化為1 int main() { ll n = read(); for (int i = 1; i <= n; ++i) { int x = read(); if (i == 1) { f[1] = x; continue; } int l = 1, r = ans, mid; while (l <= r) { mid = (l + r) >> 1; if (x <= f[mid]) r = mid - 1; else l = mid + 1; } f[l] = x; if (l > ans) ++ans; } printf("%lld\n", ans); return 0; }
dp
int f[1050][1050], n, l, k; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> f[i][1]; f[i][2] = 1; f[i][3] = 0; } for (int i = n - 1; i >= 1; --i) { l = 0, k = 0; for (int j = i + 1; j <= n; ++j) if ((f[j][1] > f[i][1]) && (f[j][2] > l)) { l = f[j][2]; k = j; } if (l > 0) { f[i][2] = l + 1; f[i][3] = k; } } k = 1; for (int j = 1; j <= n; ++j) if (f[j][2] > f[k][2]) k = j; cout << f[k][2] << endl; return 0; }