https://www.acmicpc.net/problem/2421
๋ฌธ์
ํํ์์ ์ ๊ธํต 2๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํํ์์ ๋งค์ผ๋งค์ผ ํ๋์ ์ ๊ธํต์ 1์์ ๋ฃ๋๋ค. ๋ ์ ๊ธํต์ ๋ชจ๋ N์์ด ๋ชจ์ด๋ฉด ํ์์ด๋ ์๋ก์ด ์ฅ๋๊ฐ์ ์ด ์ ์๊ธฐ ๋๋ฌธ์, ์ ๊ธ์ ๋ฉ์ถ๋ค.
ํํ์์ ์์๋ฅผ ์ข์ํ๋ ๊ฒ์ผ๋ก ์๊ฐ๋์์ ์ ๋ช ํ๊ธฐ ๋๋ฌธ์, ์ฒซ์งธ ์ ๊ธํต์ ๋ค์ด์๋ ๋์ ์๊ณผ ๋์งธ ์ ๊ธํต์ ๋์ ์์ ์ด์ด๋ถ์์ ๋, ๊ทธ๊ฒ์ด ์์๊ฐ ๋๋ ๊ฒ์ ๋๋ฌด๋๋ ์ข์ํ๋ค.
์๋ฅผ ๋ค์ด, ์ฒซ์งธ ์ ๊ธํต์ 12์์ด ์๊ณ , ๋์งธ ์ ๊ธํต์ 7์์ด ์๋ค๊ณ ํ์. ๊ทธ๋ผ ๊ทธ ๋ ์๋ฅผ ์ด์ 127์ ์์๊ฐ ๋๋ค.
์ด์ , ์ต๋ํ ์์๊ฐ ๋ง์ด ๋์ค๋๋ก, ํํ์์ด ๋์ ๋ฃ๋ ์ต์ ์ ์์๋ฅผ ์ฐพ์๋ด๋ฉด ๋๋ค. ๊ฐ์ฅ ์ฒ์์ ๋ ์ ๊ธํต์๋ 1์์ฉ ๋ค์ด์๋ค.
์๋ฅผ ๋ค์ด, N=4์ผ ๋๋ฅผ ๋ณด์.
1,1 → 2,1 → 2,2 → 3,2 → 3,3 → 4,3 → 4,4
์์๊ฐ์ด ๋์ ๋ฃ์ผ๋ฉด ์์๋ ์ค์ง 1๋ฒ ๋ฑ์ฅํ๋ค. (43)
ํ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ด ๋์ ๋ฃ์ผ๋ฉด ์์๋ 3๋ฒ (31,41,43) ๋ฑ์ฅํ๊ฒ ๋๋ค.
1,1 → 2,1 → 3,1 → 4,1 → 4,2 → 4,3 → 4,4
์์ ์๊ฐ N=4์ผ ๋ ์ ๋ต์ด๋ค. ๊ฐ์ฅ ์ฒ์์ 11์ ์ธ์ง ์๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1<=N<=999)
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์์๊ฐ ๊ฐ์ฅ ๋ง์ด ๋์ค๋ ์ ๊ธ ๋ฐฉ๋ฒ์์ ์์๊ฐ ๋์ค๋ ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
[i, j] ๋ ๋ฌด์กฐ๊ฑด [i-1, j] ๋ [i, j-1] ๋ ์ค ํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ ์จ๋ค.
๊ทธ๋ ๋ค๋ฉด [i,j]๋ ์ ๋ ๊ฒฝ์ฐ๊ฐ ๊ฑฐ์ณ์ค๋ฉด์ ๊ฐ์ง ์์์ ๊ฐฏ์๋ฅผ ๊ฐ์ง ๊ฒ์ด๋ค
๊ทธ๋ฆฌ๊ณ [i,j]๋ ์์๋ผ๋ฉด ๊ทธ ๊ฐฏ์์ 1์ ๋ํ ๊ฐ์ ๊ฐ์ง๋ค.
์ฆ, dp ๋ฌธ์ ๋ค. ๊ทผ๋ฐ ์ด์ 2์ฐจ์์ ๊ณ๋ค์ธ..
2์ฐจ์ ๋ฒกํฐ dp๋ฅผ ๋ง๋ค์ด์ค๋ค.
dp[i][j] = i์ j๋ฅผ ์ด์ด๋ถ์ธ ๊ฐ์ด ๋๊ธฐ๊น์ง ๋์จ ์์์ ๊ฐฏ์
์ด์ค for๋ฌธ์ผ๋ก ๊ฐ ํญ์ ๋๋ฉด์ ์ง์ ๋จ๊ณ ๋๊ฐ([i-1,j] [i,j-1])๋ฅผ ๋น๊ตํ๋ฉด์ dp๋ฅผ ์ํํ์
๋ ๋จ๊ณ์ค ๋ ํฐ ๊ฐ์ ๊ณ ๋ฅด๊ณ , ๋ง์ฝ [i,j]๊ฐ ์์๋ผ๋ฉด 1์ ๋ํด์ค๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ํด๋น ํญ([i,j])์ด ์์์ธ์ง ์ฌ๋ถ๋ฅผ ์์ํ๋ค.
2์ฐจ์ ๋ฒกํฐ v๋ฅผ ๋ ๋ง๋ค์ด์คฌ๋ค.
v[i][j] = i์ j๋ฅผ ์ด์ด๋ถ์ธ ๊ฐ์ด ์์์ธ๊ฐ
v๋ฅผ ์ฑ์ฐ๋ ค๋ฉด i์ j๋ฅผ ์ด์ด๋ถ์ธ ๊ฐ์ ๊ตฌํด์ผํ๋ค.
๋ ์๋ฅผ ๋ฌธ์์ด๋ก ๋ง๋ค์ด์ ๋ถ์ฌ์ฃผ๊ณ ์ด๋ฅผ ๋ค์ ์ ์๋ก ๋ฐ๊ฟ์ฃผ๋ ํจ์๋ฅผ ์ ์ํ๋ค.
int connectedNum(int a, int b) {
return stoi(to_string(a) + to_string(b));
}
์ด์ ํน์ ์๊ฐ ์์์ธ์ง ์ฌ๋ถ๋ ์์์ผํ๋ค. ๋ฒกํฐ ํ๋๋ฅผ ๋ง๋ค์
isPrime[i] : i๊ฐ ์์์ธ๊ฐ?
isPrime.assign(maxValue, true);
isPrime[1] = false;
for(int i=2; i*i<=maxValue; i++) {
if(!isPrime[i]) {
continue;
}
for(int j=i*i; j<=maxValue; j+=i) {
isPrime[j] = false;
}
}
์ฐธ๊ณ ๋ก n์ ์ต๋๊ฐ์ด 999๋ค
์ด ๊ฒฝ์ฐ 999999๋ผ๋ ์๊น์ง ์์ ์ฌ๋ถ๋ฅผ ๊ตฌํด๋์ผ ์ ๋๋ก ์จ๋จน์ ์ ์๋ค
isPrime์ n๊น์ง๋ง ๊ตฌํ์ง ์๋๋ก ์ฃผ์ํ์
int maxValue = connectedNum(n,n);
์ฝ๋
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
using namespace std;
vector<bool>isPrime;
int connectedNum(int a, int b) {
return stoi(to_string(a) + to_string(b));
}
int main() {
int n;
cin >> n;
// isPrime[i] : i๊ฐ ์์์ธ๊ฐ?
int maxValue = connectedNum(n,n);
isPrime.assign(maxValue, true);
isPrime[1] = false;
for(int i=2; i*i<=maxValue; i++) {
if(!isPrime[i]) {
continue;
}
for(int j=i*i; j<=maxValue; j+=i) {
isPrime[j] = false;
}
}
// v[i][j] = i์ j๋ฅผ ์ด์ด๋ถ์ธ ๊ฐ์ด ์์์ธ๊ฐ
vector<vector<bool>>v(n+1, vector<bool>(n+1, false));
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
int num = connectedNum(i, j);
v[i][j] = isPrime[num];
}
}
// dp[i][j] = i์ j๋ฅผ ์ด์ด๋ถ์ธ ๊ฐ์ด ๋๊ธฐ๊น์ง ๋์จ ์์์ ๊ฐฏ์
vector<vector<int>>dp(n+1, vector<int>(n+1, 0));
dp[1][1] = 0;
for(int i=2; i<=n; i++) { // dp ์ด๊ธฐํ
dp[1][i] = dp[1][i-1] + v[1][i];
dp[i][1] = dp[i-1][1] + v[i][1];
}
for(int i=2; i<=n; i++) { // dp
for(int j=2; j<=n; j++) {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + v[i][j];
}
}
// ์ถ๋ ฅ
cout << dp[n][n];
return 0;
}
'๐๏ธ ICPC Sinchon > Dynamic Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 2313๋ฒ: ๋ณด์ ๊ตฌ๋งคํ๊ธฐ (0) | 2024.09.23 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 1577๋ฒ: ๋๋ก์ ๊ฐ์ (0) | 2024.09.16 |
[BOJ][C++] ๋ฐฑ์ค 4883๋ฒ: ์ผ๊ฐ ๊ทธ๋ํ (0) | 2024.09.13 |
[BOJ][C++] ๋ฐฑ์ค 2688๋ฒ: ์ค์ด๋ค์ง ์์ (0) | 2024.09.06 |
[BOJ][C++] ๋ฐฑ์ค 1904๋ฒ: 01ํ์ผ (0) | 2024.08.25 |