동적계획법으로 풀었다.

memset에서 초기화 해줄 때 크기에 자료형 크기만큼 해주지 않아 초기에 오답이 발생했다.

메모이제이션.

base case 초기에 넣어주고 이미 기록 되어있는지 확인. 그 위치에 간 기록이 있고 결과가 있는지.

 

있다면 바로 반환, 없다면 계산을 하기위해 다시 문제를 작은문제로 분할.

아래로 가는경우와 오른쪽으로 가는 경우.

 

https://algospot.com/judge/problem/read/JUMPGAME

 

algospot.com :: JUMPGAME

외발 뛰기 문제 정보 문제 땅따먹기를 하다 질린 재하와 영훈이는 땅따먹기의 변종인 새로운 게임을 하기로 했습니다. 이 게임은 그림과 같이 n*n 크기의 격자에 각 1부터 9 사이의 정수를 쓴 상태로 시작합니다. 각 차례인 사람은 맨 왼쪽 윗 칸에서 시작해 외발로 뛰어서 오른쪽 아래 칸으로 내려가야 합니다. 이 때 각 칸에 적혀 있는 숫자만큼 오른쪽이나 아래 칸으로 움직일 수 있으며, 중간에 게임판 밖으로 벗어나면 안 됩니다. 균형을 잃어서 다른 발로 서거

algospot.com

 

#include <bits/stdc++.h>

using namespace std;

int board[100][100];
int cache[100][100];

int sol(int x, int y, int size){
	if(x>=size || y>=size){
		//넘침 
		return 0;
	}
	if(x == size-1 && y == size -1){
//		도착 
		return 1;
	} 
	
	if(cache[x][y] != -1){
		return cache[x][y];
	} 
	int jum = board[x][y];
	int &ret = cache[x][y];
	//오른쪽으로 가능 경우
	return ret = max(sol(x+jum, y, size), sol(x, y+jum, size));
	//아래로 가는 경우 
}

int main(){
  int n;
  cin>>n;
  for(int _times = 0; _times < n; ++_times)
  {
  	memset(cache, -1, 10000*sizeof(int));
	int _size;
	cin>>_size;
	for(int i=0; i<_size; ++i){
	  for(int j=0; j<_size; ++j){
		cin>>board[i][j];
	  }
	}
	if(sol(0, 0, _size)==1){
		cout<<"YES"<<endl;
	}else{
		cout<<"NO"<<endl;
	}
  }
 return 0;
}

+ Recent posts