๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ๋ฑ 2๋ฒ ํ์ ํ ์ ์๊ณ , ์ฒ์ ๋ฐ๋ผ๋ณด๊ณ ์๋ ๋ฐฉํฅ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ณ ์ ์ด๋ค. ์ฆ ์ค๋ฅธ์ชฝ -> ์ผ์ชฝ -> ๋ค์ ์ค๋ฅธ์ชฝ, ์ด๋ ๊ฒ 3๊ฐ์ง ๊ฒฝ์ฐ๋ง ์กด์ฌํ๊ฒ ๋๋ค.
์ฃผ์ด์ง๋ ์์ ๋ค์ ์ธ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ๊ณ์ฐํด๋ ์ ๋๋ก ๋ ์ ๋ต์ด ๋์ฌ ์ ์์ง๋ง ์ค์ ๋ก๋ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ๋ํด ๊ณ ๋ คํด์ผ ํ๋ค. ํ์ง๋ง N์ด 20๋ง์ด๊ธฐ ๋๋ฌธ์ ์์ ์์ ํ์์ ๋ถ๊ฐ๋ฅํ๊ณ ์ ์ ํ๊ฒ DP๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๋ชจ๋ ์์น์ ๋ํด ์๋์ ๊ฐ์ด ์ธ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๊ฒ ๋๋ค.
- ์ค๋ฅธ์ชฝ
- ํ ๋ฒ ๋ฐฉํฅ ๋ฐ๊พผ ์ผ์ชฝ
- ๋ ๋ฒ ๋ฐฉํฅ ๋ฐ๊ฟ์ ๋ค์ ์ค๋ฅธ์ชฝ
๋ง์ฝ ์์ ์์น 1์ ์๋ค๊ณ ํ๋ฉด ์ฌ๊ธฐ์๋ ๋ฐ๋ผ๋ณด๊ณ ์๋ ๋ฐฉํฅ์ผ๋ก 1์นธ ์ด๋ํ๊ฒ ๋๋ค. ์ด๋๊น์ง๋ ๋ฐฉํฅ์ ํ ๋ฒ๋ ๋ฐ๊พธ์ง ์์์ผ๋ฏ๋ก ๋ฐฉํฅ์ ๋ฐ๊ฟ ๊ธฐํ๊ฐ ์กด์ฌํ๋ค. ๊ฒฐ๊ตญ ํ์ฌ ๋ฐฉํฅ์ผ๋ก ์ง์งํ๊ฑฐ๋, ๋ฐฉํฅ์ ๋ฐ๊ฟ์ ์ง์งํ๋ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๊ฒ ๋๋ค.
1๋ฒ์ ํ์ฌ ๋ฐฉํฅ์ผ๋ก์ ์ง์ง, 2๋ฒ์ ๋ฐฉํฅ ๋ฐ๊ฟ์ ์ง์ง์ด๋ค. ๊ฒฐ๊ตญ ๋ฐฉํฅ์ ๋ฐ๊ฟ๋๋ง๋ค 1ํ์ฉ ๋ด๋ ค๊ฐ๊ฒ ๋๊ณ , 1๋ฒ ํ์์๋ ์ง์ง์ ํ ๋ ํ์ฌ ์์น์์ ์์น๊ฐ์ ๋นผ์ฃผ๊ธฐ๋งํ๋ฉด ๋๋ค.
2๋ฒ ํ์ ๋๋ฌํ๊ฒ ๋๋ฉด ๋ ์ด์ ๋ฐฉํฅ์ ๋ฐ๊ฟ ์ ์์ผ๋ฏ๋ก ์ง์ง๋ง ๊ฐ๋ฅํ๋ค.
์ต๋๊ฐ์ ๊ตฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฐ์ ์ด๊ธฐํ ๊ฐ์ Integer.MIN_VALUE
๋ก ํด์ฃผ์ด์ผ ํ๋ค. ์ด๋ ๊ฐ์ ์์น๋ฅผ ์ฌ๋ฌ๋ฒ ๋ฐฉ๋ฌธํ๊ฒ ๋ ์๋ ์๋๋ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์น์์ ์ป์ ์ ์๋ ๊ฐ์ ์ค๋ณต๋๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ๋ฐฉ๋ฌธํ ๊ณณ์ด๋ผ๋ฉด ๋ ๋ฒ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์๋๋ก ํด์ผ ํ๋ค.
๊ทธ๋์ ์ฒ์ ์ด๊ธฐํ ๊ฐ์ -1
๋ก ์ค์ ํ๊ณ , ๋ง์ฝ ํด๋น ๋
ธ๋์ ๋ฐฉ๋ฌธํ๋๋ฐ ๊ฐ์ด -1
์ด ์๋๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ฒ์ด๋ฏ๋ก ์ ์ฅ๋ ๊ฐ์ ๋ฐํ์ํค๋ฉด ๋๋ค. ์ด๋ ์ด๊ธฐํ ๊ฐ์ Integer.MIN_VALUE
๋ก ํ์ง ์๋ ๊ฒ์ ์ด ๋
ธ๋์ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ์ ์๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ด ๊ทธ๋๋ก ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ ์ด ๊ฐ์ ํ์ฌ ๋
ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ ๊ธฐ์ค๊ฐ์ผ๋ก ์ค์ ํ๊ฒ ๋๋ฉด ํด๋น ๋
ธ๋์ ๋ฐฉ๋ฌธํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒ๊ณผ ํด๋น ๋
ธ๋์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ๊ฒ์ด ๊ฐ์ ๋ฐฉ์์ผ๋ก ํํ๋๊ธฐ ๋๋ฌธ์... ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ์ฆ ์ด ๋
ธ๋์๋ ํ ๋ฒ๋ ๋ฐฉ๋ฌธํ ์ ์ด ์์ด์~๋ผ๋ ๋ป๊ณผ ์ด ๋
ธ๋ ๋ฐฉ๋ฌธํด๋ดค๋๋ ๋ฐฉ๋ฌธํ ๋ฐฉ๋ฒ์ด ์๋๋ผ๋ ๋ฐฉ๋ฌธํ๊ฒ๋ ๋ฐฉ๋ฌธํ ๊ฒ๋ ์๋ ์ถฉ๋์ด ์๊ธด๋ค๋ ๋ป.
๊ทธ๋์ ์ด๊ธฐํ ๊ฐ์ -1๋ก ๋ฐ๋ก ์ค์ ํด์ฃผ๋ ๊ฒ ์ข๋ค.
import java.util.*;
import java.io.*;
public class Main {
static int[] pos;
static int N;
static int[][] dp;
public static int f(int cur, int u) {
if (cur < 0 || cur >= N) return Integer.MIN_VALUE;
if (cur == N-1) return 0;
if (dp[cur][u] != -1) return dp[cur][u];
dp[cur][u] = Integer.MIN_VALUE;
if (u == 0) {
dp[cur][u] = Math.max(f(cur + pos[cur], u), f(cur - pos[cur], u+1)) + 1;
} else if (u == 1) {
dp[cur][u] = Math.max(f(cur - pos[cur], u), f(cur + pos[cur], u+1)) + 1;
} else {
dp[cur][u] = f(cur + pos[cur], u) + 1;
}
return dp[cur][u];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
pos = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
pos[i] = Integer.parseInt(st.nextToken());
}
dp = new int[N][3];
for (int i = 0; i < N; i++) {
Arrays.fill(dp[i], -1);
}
// dp[0][0] = 0;
int answer = f(0, 0);
System.out.println(answer > 0 ? answer : -1);
}
}