가장 긴 바이토닉 부분 수열

BiBi·2021년 1월 15일
0

코딩테스트연습

목록 보기
10/66
#include <stdio.h>

int p[1001];
int dp[1001];
int ap[1001];

int get_max(int a, int b) {
	return a > b ? a : b;
}

int main() {
	//freopen("input.txt", "rt", stdin);
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &p[i]);
		dp[i] = 1;
		ap[i] = 0;
	}
	for (int i = 1; i <= n; i++) {
		//printf("%d\n", p[i]);
		for (int j = 1; j <= i; j++) {
			if (p[i] > p[j]) {
				dp[i] = get_max(dp[i], dp[j] + 1);
				//printf("dp[%d]=%d\n", i, dp[i]);
			}
		}
	}
	for (int i = n; i >= 1; i--) {
		//printf("%d\n", p[i]);
		for (int k = n; k >= i; k--) {
			if (p[i] > p[k]) {
				ap[i] = get_max(ap[i], ap[k] + 1);
				//printf("ap[%d]=%d\n", i, ap[i]);
			}
		}
	}
	int m = 0;
	for (int i = 1; i <= n; i++) {
		if (m < ap[i] + dp[i]) {
			m = ap[i] + dp[i];
		}
	}
	printf("%d", m);

	return 0;
}
profile
Server Network Engineer

0개의 댓글