๋ฌธ์
https://www.acmicpc.net/problem/1890
๋ฌธ์ ์ดํด
์๊ฐ ์ ํ ์๋ N×N ๊ฒ์ํ์์ ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์ผ๋ก ๊ท์น์ ๋ฐ๋ผ ์ ํํ๋ค.
๊ท์น์ ๋ง๊ฒ ์ด๋ํ ์ ์๋ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
๊ท์น
- ๊ฐ ์นธ์ ์ ํ์๋ ์๋ ํ์ฌ ์นธ์์ ๊ฐ ์ ์๋ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
- 0์ ์ข ์ฐฉ์ ์ ์๋ฏธํ๋ค.
- ํ์ฌ ์นธ์ ์ ํ์๋ ์๋งํผ ์ค๋ฅธ์ชฝ์ด๋ ์๋๋ก๋ง ์ด๋ ๊ฐ๋ฅํ๋ค.
- ํ ๋ฒ ์ ํํ ๋ ๋ฐฉํฅ์ ๋ฐ๊ฟ ์ ์๋ค. ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ ์๋๋ก ์ ํ๋ฅผ ํ๋ ๋ ๊ฒฝ์ฐ๋ง ์กด์ฌํ๋ค.
๋ฌธ์ ํ์ด
๐ ์ ๊ทผ
๊ฐ ์นธ๋ง๋ค ํ์ฌ ์นธ๊น์ง์ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค.
๐ก Dynamic Programming
์นธ์ ์ ํ ์๋งํผ ์ด๋ํด์ ํด๋น ์นธ๊น์ง์ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค.
- ์ฒซ ๋ฒ์งธ ์นธ(๊ฒฝ๋ก์ ๊ฐ์ 1)๋ถํฐ ์์ํ๋ค.
- ์ค๋ฅธ์ชฝ์ผ๋ก ์ ํํ๋ค:
๋ค์ ์ด = j + v[i][j]
dp[i][๋ค์ ์ด] += dp[i][j](์ด์ ์นธ๊น์ง์ ๊ฒฝ๋ก์ ๊ฐ์) - ์๋๋ก ์ ํํ๋ค:
๋ค์ ํ = i + v[i][j]
dp[๋ค์ ํ][j] += dp[i][j]
๐จ
- ๊ฒฝ๋ก์ ๊ฐ์์ ๋ฒ์(<=2^63-1)๋ฅผ ๊ณ ๋ คํ์ฌ ์๋ฃํ(long long)์ ์ค์ ํ๋ค.
- ์ธ๋ฑ์ค๊ฐ ๊ฒ์ํ ๋ฒ์๋ฅผ ๋์ง ์๋๋ก ํ๋ค. (< n)
- ๋ง์ง๋ง ์นธ์์ ๊ฒฝ๋ก๊ฐ ์ค๋ณต ๊ณ์ฐ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค. (dp[i][j] += dp[i][j] ๊ฐ ๋๋ ๊ฒฝ์ฐ)
์ฝ๋
#include <iostream>
#include <vector>
using namespace std;
using ll = long long;
ll countRoute(int n, vector<vector<int>> &v)
{
vector<vector<ll>> dp(n, vector<ll>(n, 0));
dp[0][0] = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (!v[i][j])
continue;
int nr = i + v[i][j];
int nc = j + v[i][j];
if (nc < n)
dp[i][nc] += dp[i][j];
if (nr < n)
dp[nr][j] += dp[i][j];
}
}
return dp[n - 1][n - 1];
}
int main()
{
int n;
vector<vector<int>> v;
cin >> n;
v.assign(n, vector<int>(n, 0));
for(int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> v[i][j];
cout << countRoute(n, v);
return 0;
}'๐ญ Problem Solving > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ][C++] ๋ฐฑ์ค 2606๋ฒ: ๋ฐ์ด๋ฌ์ค (0) | 2025.05.13 |
|---|---|
| [BOJ][C++] ๋ฐฑ์ค 1303๋ฒ: ์ ์ - ์ ํฌ (0) | 2025.04.23 |
| [BOJ][C++] ๋ฐฑ์ค 2579๋ฒ: ๊ณ๋จ์ค๋ฅด๊ธฐ (0) | 2025.04.23 |
| [BOJ][C++] ๋ฐฑ์ค 1260๋ฒ: DFS์ BFS (0) | 2025.04.23 |
| [BOJ][C++] ๋ฐฑ์ค 2667๋ฒ: ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (0) | 2024.11.11 |