https://www.acmicpc.net/problem/2253
2253번: 점프
N(2 ≤ N ≤ 10,000)개의 돌들이 같은 간격으로 놓여 있다. 편의상 순서대로 1, 2, …, N번 돌이라고 부르자. 당신은 현재 1번 돌 위에 있는데, 이 돌들 사이에서 점프를 하면서 N번째 돌로 이동을 하려
www.acmicpc.net
[난이도] Gold4
[유형] DP
[풀이]
DP[n][k] : n = 현재 돌의 번호, k = 이전에 점프한 칸의 개수
k는 최악의 겨우에도
1+2+3+4+...k=10000
이므로 (k+1)k/2 = 10000 의 식을 이용하면 대략 500은 절대 넘지 않으므로
배열을 DP[10000][500] 으로 설정하여 메모리 초과를 피하였씁니다.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int N,M,dp[10001][500],a[10000],inf=9e8;
int sol(int n,int k){
if(n==N) return 0;
if(n>N||a[n]) return -1;
int& ret = dp[n][k];
if(ret!=-1) return ret;
ret=inf;
for(int i=k-1;i<=k+1;i++){
if(i<1) continue;
int v = sol(n+i,i);
if(v==-1) continue;
ret=min(ret,v);
}
if(ret==inf) return ret=-1;
ret++;
return ret;
}
int main(){
scanf("%d%d",&N,&M);
while(M--){
int v;
scanf("%d",&v);
a[v]=1;
}
memset(dp,-1,sizeof(dp));
int ans = sol(2,1);
if(ans==-1) puts("-1");
else printf("%d",ans+1);
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/2253.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold5] 15661 : 링크와 스타트 (C++) (0) | 2022.11.06 |
---|---|
[BOJ/백준][Gold5] 17218 : 비밀번호 만들기 (C++) (0) | 2022.11.06 |
[BOJ/백준][Silver3] 16967 : 배열 복원하기 (C++) (0) | 2022.11.06 |
[BOJ/백준][Silver2] 2210 : 숫자판 점프 (C++) (0) | 2022.11.06 |
[BOJ/백준][Silver2] 15664 : N과 M (10) (C++) (0) | 2022.11.06 |