HDU 1950 Bridging signals(DP Dynamic Planning + 2분 검색 O(nlogn))

#include <stdio.h>
#define MAX_POARTS 40000

int numOfTests;
int numOfPorts;
int arrayOfPorts[MAX_POARTS + 1];
//minTail[len]        len            (           )      
int minTail[MAX_POARTS + 1];
//       minTail[lenOfIS]
int lenOfIS;//length of increasing subsequence
int result;//length of longest of increasing subsequence

//          minTail port   ,  port  minTail ,      port       
int binSearch(int port){
	int start = 1;
	int end = result;
	while (start <= end){
		int mid = (start + end) / 2;
		if (port < minTail[mid])
			end = mid - 1;
		else if(port > minTail[mid]) 
			start = mid + 1;
		else
			return mid;
	}
	return start;
}


int main(){

	scanf("%d", &numOfTests);
	int test;
	for (test = 1; test <= numOfTests; test++){
		scanf("%d", &numOfPorts);
		int indexOfPort;
		for (indexOfPort = 1; indexOfPort <= numOfPorts; indexOfPort++)
			scanf("%d", &arrayOfPorts[indexOfPort]);
			
		result = 1;
		minTail[result] = arrayOfPorts[1];
		for (indexOfPort = 2; indexOfPort <= numOfPorts; indexOfPort++){
			int port = arrayOfPorts[indexOfPort];
			lenOfIS = 0;
			if (port <= minTail[1])
				lenOfIS = 1;
			else if (port > minTail[result])
				lenOfIS = ++result;
			else if (port < minTail[result])
				lenOfIS = binSearch(port);
			minTail[lenOfIS] = port;
		}

		printf("%d
", result); } return 0; }

좋은 웹페이지 즐겨찾기