本题一看就知道是最长不减序列了,一想就以为是使用dp攻克了。
只是那是个错误的思路。
我就动了半天没动出来。然后看了看别人是能够使用dp的,只是那个比較难证明其正确性,而其速度也不快。故此并非非常好的解决方法。
所以我就直接硬算。硬模拟选择出非减子序列,选完就出答案了。
思路:
1 依照长度排序
2 依照不减原则选择重量,选一个,消灭一个。
最后消灭完了,就处理完成,答案就自然出来了。
原来是一道披着dp的外套的模拟题啊!一道伪装成难题的简单题。
代码也能够写的非常简洁:
#include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <limits.h> #include <stack> #include <queue> #include <set> #include <map> using namespace std; int N; const int MAX_N = 5001; pair<int, int> arr[MAX_N]; int calIncrese() { int ans = 0; sort(arr, arr+N); for (int i = 0; i < N; i++) { if (arr[i].second == INT_MIN) continue; int wei = arr[i].second; ans++; for (int j = i+1; j < N; j++) { if (arr[j].second >= wei) wei = arr[j].second, arr[j].second = INT_MIN; } } return ans; } int main() { int T; scanf("%d", &T); while (T--) { scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d %d", &arr[i].first, &arr[i].second); } printf("%d ", calIncrese()); } return 0; }