POJ 1631 Bridging signals
2012-12-09 18:04
369 查看
题目抽象一下,就是使得该工厂没有交叉的线路,且最多可以拥有几条连线。
思路:很明显的最长上升子序列,由于n比较大,单纯的O(n^2)过不了,所以需要O(nlogn)的贪心算法过。
思路:很明显的最长上升子序列,由于n比较大,单纯的O(n^2)过不了,所以需要O(nlogn)的贪心算法过。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std; const int MAXN = 40100; const int INF = 0x3f3f3f3f; int A[MAXN]; int S[MAXN], d[MAXN]; int n; void init() { for(int i = 1; i <= n; i++) S[i] = INF; S[0] = -INF; d[0] = 0; } int BSearch(int x, int y, int q) { while(x <= y) { int mid = x+(y-x)/2; if(S[mid] >= q) y = mid-1; else x = mid+1; } return x; } void dp() { init(); int ans = 0; for(int i = 1; i <= n; i++) { int x = 0, y = i; int pos = BSearch(x, y, A[i]); d[i] = pos; S[d[i]] = min(S[d[i]], A[i]); ans = max(ans, d[i]); } printf("%d\n", ans); } void read_case() { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &A[i]); } void solve() { read_case(); dp(); } int main() { int T; scanf("%d", &T); while(T--) { solve(); } return 0; }
相关文章推荐
- Poj 1631 Bridging signals (LIS, nlog(n))
- Poj 1631 Bridging signals(二分+DP 解 LIS)
- 【最长上升子序列】北大 POJ 1631 Bridging signals
- poj 1631 Bridging signals
- POJ1631——Bridging signals(动态规划)
- POJ 1631 Bridging signals
- poj 1631 Bridging signals
- DP:Bridging Signals(POJ 1631)
- poj 1631
- Poj 1631 Bridging signals(二分+DP 解 LIS)
- POJ 1631 Bridging Singnals
- poj1631 Bridging signals
- poj - 1631 - Bridging signals(LIS)
- POJ 1631 Bridging signals(LIS O(nlogn)算法)
- Poj 1631(dp)
- POJ 1631 Bridging signals (LIS:最长上升子序列)
- poj 1631 Bridging signals
- HDU 1950 POJ 1631 Bridging signals【LIS,二分优化】
- poj 1631 Painter's Problem(数学:高斯消元)
- POJ 1631