POJ 1088 스키 - 동적 기획

제목 주소:http://poj.org/problem?id=1088
Description
마 이 클 이 스키 백 을 좋아 하 는 것 은 이상 하지 않다. 왜냐하면 스키 는 확실히 자극 적 이기 때문이다.그러나 속 도 를 얻 기 위해 서 는 미 끄 러 지 는 구역 이 아래로 기울 어야 하고, 언덕 아래로 미 끄 러 지면 다시 언덕 을 올 라 가 거나 승강기 가 태 워 줄 때 까지 기 다 려 야 한다.마 이 클 은 한 지역 에서 가장 긴 바닥 슬로프 를 싣 고 싶 어 한다.구역 은 2 차원 배열 로 제 시 됩 니 다.배열 의 모든 숫자 대표 점 의 높이.다음은 하나의 예 이다.
 1  2  3  4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

한 사람 은 어떤 점 에서 상하 좌우 로 네 개의 점 중 하나 로 미 끄 러 질 수 있 으 며, 높이 만 줄 일 수 있다.위의 예 에서 미 끄 러 질 수 있 는 슬로프 는 24 - 17 - 16 - 1 이다.그럼요. 25 - 24 - 23 -... - 3 - 2 - 1 이 더 길 어 요.사실 이것 이 가장 긴 것 이다.
Input
입력 한 첫 줄 은 영역의 줄 수 R 과 열 수 C (1 < = R, C < = 100) 를 표시 합 니 다.다음은 R 줄 이 고 줄 마다 C 개의 정수 가 있 으 며 높이 h, 0 < = h < = 10000 을 대표 합 니 다.
Output
출력 최 장 영역의 길이 입 니 다.
Sample Input
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

Sample Output
25
#include 

int matrix[100][100];
int dp[100][100];
int R;
int C;

int Max (int a, int b, int c, int d){
	int max1 = (a > b) ? a : b;
	int max2 = (c > d) ? c : d;
	return (max1 > max2) ? max1 : max2;
}

// dp[i][j] = max(dp[i-1][j], dp[i+1][j], dp[i][j-1], dp[i][j+1]) + 1
int MaxLength(int i, int j){
	if (dp[i][j] > 0)
		return dp[i][j];
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	if (i-1 >= 0 && matrix[i][j] > matrix[i-1][j]){
		a = MaxLength (i-1, j);
	}
	if (i+1 < R && matrix[i][j] > matrix[i+1][j]){
		b = MaxLength (i+1, j);
	}
	if (j-1 >= 0 && matrix[i][j] > matrix[i][j-1]){
		c = MaxLength (i, j-1);
	}
	if (j+1 < C && matrix[i][j] > matrix[i][j+1]){
		d = MaxLength (i, j+1);
	}
	return dp[i][j] = Max (a, b, c, d) + 1;
}

int main(void){
	int i, j;
	int max;

	while (scanf ("%d%d", &R, &C) != EOF){
		for (i=0; i

좋은 웹페이지 즐겨찾기