标签:
相当于用多个O(nlog(n))LIS来做。
// // main.cpp // 160322 // // Created by 陈加寿 on 16/3/22. // Copyright © 2016年 chenhuan001. All rights reserved. // #include <iostream> #include <stdio.h> #include <math.h> #include <vector> #include <string.h> #include <algorithm> using namespace std; #define N 1100 int a[N],b[N]; vector<int> dp[N]; int main() { int T; cin>>T; while(T--) { int n,m; cin>>n>>m; for(int i=0;i<n;i++) { scanf("%d%d",a+i,b+i); dp[i].clear(); } int ans=0; ans = 1; for(int i=0;i<=m;i++) { dp[i].push_back(a[0]); } for(int i=1;i<=m;i++) { if(a[0]>b[0]) { dp[i][0]=b[0]; } } vector<int>::iterator p; for(int i=1;i<n;i++) { for(int j=m;j>=0;j--) { if(j!=m) { p =lower_bound(dp[j].begin(), dp[j].end(), b[i]); if(p==dp[j].begin()) { dp[j+1][0] = min(dp[j+1][0],b[i]); } else if(p==dp[j].end()) //我这等于最后 { int sz=dp[j].size(); if(dp[j+1].size() == sz) { dp[j+1].push_back(b[i]); ans = max(ans,sz+1); } else dp[j+1][sz]=min(dp[j+1][sz],b[i]); } else { int cnt = p-dp[j].begin();//这一步我不知道可不可以这样用。。 dp[j+1][cnt] = min(dp[j+1][cnt],b[i]); } } p = lower_bound(dp[j].begin(), dp[j].end(), a[i]); if(p==dp[j].begin()) //说明所有数都大于a[i] { dp[j][0]=a[i]; } else if(p==dp[j].end()) { dp[j].push_back(a[i]); ans = max(ans,(int)dp[j].size()); } else { *p = a[i]; } } } cout<<ans<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenhuan001/p/5308308.html