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 |