https://www.acmicpc.net/problem/2352
LIS를 구해주면 되는데 포트가 최대 40000개다. O(n^2)의 시간복잡도를 가지는 소스로는 시간
초과 에러가 뜨는데 lis는 최대 O(nlogn)으로 줄여줄 수 있다. 아래는 소스코드.
#include <iostream> #include <vector> #include <algorithm> using namespace std; int n,idx; int num; int arr[40001]; int main() { ios::sync_with_stdio(false); cin>>n; vector<int> vt; vector<int>::iterator itor; for(int i=0;i<n;i++) cin>>arr[i]; vt.push_back(0); for(int i=0;i<n;i++) { num = arr[i]; if(vt[idx] < num) { vt.push_back(num); idx++; } else { itor = lower_bound(vt.begin(), vt.end(), num); *itor = num; } } cout<<vt.size()-1<<'\n'; return 0; }
https://www.acmicpc.net/problem/1365
윗문제와 마찬가지로 O(nlogn)의 시간복잡도를 가지는 소스를 사용한다.
위 소스에서 마지막 출력부만 cout<<n-(vt.size()-1)<<
'\n'
;
로 바꿔주면 된다.
https://www.acmicpc.net/problem/12015
11053문제와 같지만 범위가 늘어났다. 11053을 풀었던 O(n^2)코드로는 안되고 위의 코드를 쓰면 된다.
arr만 크기를 1000001로 늘려주자.
https://www.acmicpc.net/problem/12738
12015와 같다. 근데 범위가 -10억부터다. 위의 소스코드에서 vt.push_back(0);을
vt.push_back(-1000000001); 로 바꿔주면된다.
https://www.acmicpc.net/problem/2631
위에 1365랑 똑같다.
https://www.acmicpc.net/problem/11722
가장 긴 감소하는 수열이다. 어떻게 할까? 입력받은후 -1을 곱해서 -로 만든후 가장 긴 수열을
구하면 된다.
for(int i=0;i<n;i++)
{
cin>>arr[i];
arr[i]*=-1;
}
vt.push_back(-99999999);
https://www.acmicpc.net/problem/3745
맨 위의 소스에서 배열 크기 바꿔주고 eof가 나오기전까지 입력받도록 하면 된다.
'algorithm > problem solving' 카테고리의 다른 글
acmicpc.net 2252(위상 정렬), 1298(네트워크 플로우) (0) | 2016.09.21 |
---|---|
acmicpc.net 1912(DP), 2293(DP), 2294(DP), 2156(DP) (0) | 2016.09.20 |
acmicpc.net 11503,11568,1965(LIS(DP)), 2565(LIS(DP)) (0) | 2016.09.19 |
acmicpc.net 1992(분할 정복), 11729(분할 정복), 1780(분할 정복) (0) | 2016.09.18 |
acmicpc.net 2098(TSP), 10971(2098과 동일) (0) | 2016.09.14 |