전깃줄

03 August 2019

문제 : https://www.acmicpc.net/problem/2565

이번은 LIS 응용 문제 2를 풀어보도록 하겠습니다.

#include<stdio.h>

static int** arr;

void init(int N) {
	arr = new int*[N];
	for (int i = 0; i < N; i++)
	{
		arr[i] = new int[3];
		arr[i][0] = 0;
	}
}

int main(void) {

	int N, num, val;
	scanf("%d", &N);

	init(501);

	for (int i = 0; i < N; i++)
	{
		scanf("%d", &num);
		scanf("%d", &val);
		arr[num][0] = num;
		arr[num][1] = val;
		arr[num][2] = 0;
	}

	int maxVal = 0;

	for (int i = 1; i < 501; i++)
	{
		if (arr[i][0] != 0)
		{
			int max = 0;
			for (int k = 1; k < i; k++) {
				if (arr[k][0] < arr[i][0] && arr[k][1] < arr[i][1])
				{
					if (arr[k][2] > max)
					{
						max = arr[k][2];
					}
				}
			}
			arr[i][2] = max + 1;
			if (arr[i][2] > maxVal)
			{
				maxVal = arr[i][2];
			}
		}
	}

	printf("%d\n", N - maxVal);

	return 0;
}
문제에서는 전봇대의 위치 번호가 차례대로 주어진다고 써있지만, 예제만 보아도 순서가 보장이 안된다는 걸 확인할 수 있습니다.
전체 값의 갯수는 100개, 전체 값의 범위는 500이므로 arr를 500까지 입력 가능하게 선언해줍니다.
첫번째 전봇대 기준으로 첫번째 전봇대 번호, 두번째 전봇대 번호, 해당 전봇대보다 작은 번호 쌍을 가진 전봇대 번호의 갯수로 arr[i][0],arr[i][1],arr[i][2]로 넣어주게 됩니다.
먼저 모든 입력값을 넣어주고, 1부터 차례대로 현재의 전봇대 값 쌍보다 작은 값 중에서 본인보다 작은 전봇대 갯수가 가장 큰 갯수를 가진 전봇대의 값을 찾고 해당값보다 1 큰 값으로 적용해줍니다.
문제에서는 제외하여야 할 전선의 갯수를 찾는 문제이므로, 전체 쌍 갯수에서 가장 큰 쌍 갯수를 가진 값을 빼서 return해주도록 합니다.