https://www.acmicpc.net/problem/10942
๋ฌธ์
๋ช ์ฐ๋ ํ์ค์ด์ ํจ๊ป ํฐ๋ฆฐ๋๋กฌ ๋์ด๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค.
๋จผ์ , ํ์ค์ด๋ ์์ฐ์ N๊ฐ๋ฅผ ์น ํ์ ์ ๋๋ค. ๊ทธ ๋ค์, ๋ช ์ฐ์๊ฒ ์ง๋ฌธ์ ์ด M๋ฒ ํ๋ค.
๊ฐ ์ง๋ฌธ์ ๋ ์ ์ S์ E(1 ≤ S ≤ E ≤ N)๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, S๋ฒ์งธ ์๋ถํฐ E๋ฒ์งธ ๊น์ง ์๊ฐ ํฐ๋ฆฐ๋๋กฌ์ ์ด๋ฃจ๋์ง๋ฅผ ๋ฌผ์ด๋ณด๋ฉฐ, ๋ช ์ฐ๋ ๊ฐ ์ง๋ฌธ์ ๋ํด ํฐ๋ฆฐ๋๋กฌ์ด๋ค ๋๋ ์๋๋ค๋ฅผ ๋งํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ํ์ค์ด๊ฐ ์น ํ์ ์ ์ ์๊ฐ 1, 2, 1, 3, 1, 2, 1๋ผ๊ณ ํ์.
- S = 1, E = 3์ธ ๊ฒฝ์ฐ 1, 2, 1์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค.
- S = 2, E = 5์ธ ๊ฒฝ์ฐ 2, 1, 3, 1์ ํฐ๋ฆฐ๋๋กฌ์ด ์๋๋ค.
- S = 3, E = 3์ธ ๊ฒฝ์ฐ 1์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค.
- S = 5, E = 7์ธ ๊ฒฝ์ฐ 1, 2, 1์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค.
์์ฐ์ N๊ฐ์ ์ง๋ฌธ M๊ฐ๊ฐ ๋ชจ๋ ์ฃผ์ด์ก์ ๋, ๋ช ์ฐ์ ๋๋ต์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ด์ ํฌ๊ธฐ N (1 ≤ N ≤ 2,000)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค์๋ ํ์ค์ด๊ฐ ์น ํ์ ์ ์ ์ N๊ฐ๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ์น ํ์ ์ ์ ์๋ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
์ ์งธ ์ค์๋ ํ์ค์ด๊ฐ ํ ์ง๋ฌธ์ ๊ฐ์ M (1 ≤ M ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค.
๋ท์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์๋ ํ์ค์ด๊ฐ ๋ช ์ฐ์๊ฒ ํ ์ง๋ฌธ S์ E๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ด M๊ฐ์ ์ค์ ๊ฑธ์ณ ํ์ค์ด์ ์ง๋ฌธ์ ๋ํ ๋ช ์ฐ์ ๋ต์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์์์ ๋ฐ๋ผ์ ์ถ๋ ฅํ๋ค. ํฐ๋ฆฐ๋๋กฌ์ธ ๊ฒฝ์ฐ์๋ 1, ์๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค.
๊ณจ๋ 4..
์ผ๋จ ๋ฌธ์ ๋ฅผ ์ฝ๊ณ ๋ ์ค๋ฅด๋๋๋ก ๋ฐ๋ก ํ์ด๋ดค๋๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ด๋ค.
// ์๊ฐ์ด๊ณผ ์ฝ๋
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n;
int nlist[2001] = {0};
int m;
int s;
int e;
cin >> n;
for (int i = 0; i < n; ++i) cin >> nlist[i];
cin >> m;
for (int i = 0; i < m; ++i){
bool tf = true;
cin >> s >> e;
for (int j = s - 1; j < e; ++j){
if(nlist[j] != nlist[e-1]) tf=false;
e--;
}
if(tf) cout <<"1\n";
else cout <<"0\n";
}
}
๊ทธ๋์ ์.....dp๋ก ํ์ด์ผ๋ ๊ฑฐ๊ฐ์๋ฐ
๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ด์ ๊ณ ๋ฏผํ๋ค๊ฐ ๋ฌธ๋ ์ค์น ์๊ฐ.
dp๋ก ์์์ ๊ณผ ์ข ๋ฃ์ ์ ๊ฐ์ ๊ธฐ์ตํด์ผ ํ๋? ์ด์ฐจ์๋ฐฐ์ด?
dp[์์์ ][์ข ๋ฃ์ ] = ํฐ๋ฆฐ๋๋กฌ ์ฌ๋ถ
์ด ์์ด๋์ด๊ฐ ๋ ์ฌ๋ผ์ ๊ทธ๋ ๊ฒ ํ์ด๋ณด์๋ค
1 2 1 3 1 2 1
์ 7์๋ฆฌ ์์๋ฅผ dp ํ๋ก ๋ํ๋ด๋ฉด, ์๋์ ๊ฐ๋ค.
1์ ํฐ๋ฆฐ๋๋กฌ์ผ ๋, 0์ ํฐ๋ฆฐ๋๋กฌ์ด ์๋ ๋๋ฅผ ๋ํ๋ธ๋ค
from \ to | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | dp[1][1] = 1 | dp[1][2] = 0 | 1 | 0 | 0 | 0 | 1 |
2 | - | 1 | 0 | 0 | 0 | 1 | 0 |
3 | - | - | 1 | 0 | 1 | 0 | 0 |
4 | - | - | - | 1 | 0 | 0 | 0 |
5 | - | - | - | - | 1 | 0 | 1 |
6 | - | - | - | - | - | 1 | 0 |
7 | - | - | - | - | - | - | 1 |
๋ฐ๊ฒฌํ ์ ์๋ ๊ท์น์, i == j ์ผ๋๋ ํญ์ ํฐ๋ฆฐ๋๋กฌ์ด๋ฉฐ 1์ ๋ค์ ๊ฐ์ ํญ์ 0์ด๋ค. -> ๊ทผ๋ฐ ์ด๊ฑฐ ์กฐ๊ฑดํ๋ณ์ ๋ฃ์ผ๋ฉด ํ๋ฆผ.. ์๊ฐ์ด๊ณผ๋๋?
๋ถํ์ํ ์กฐ๊ฑด ๊ฑฐ๋ฅด๋๊ฑด ๊ฑ ๋ฌด์ํ๊ณ
1์ด ๋๋ ๊ฒฝ์ฐ๋ง ์๊ฐํด์ผ๊ฒ ๋ค
์กฐ๊ฑด์
1. dp[i][i]๋ ํญ์ 1์ด๋ค.
2. nlist[i]์ nlist[i+1]์ด ๊ฐ๋ค๋ฉด, dp[i][i+1]๋ ํญ์ 1์ด๋ค.
3. ์๋์๋ ๋งจ์์ ์==๋งจ๋ค์ ์ && dp[๋งจ์+1][๋งจ๋ค-1] ์ด 1์ด๋ฉด dp[i][j]๋ ํญ์ 1์ด๋ค.
์ด๋ ๊ฒ๋ง ๋ฐ์ ธ์ ํ์๋ค..
๋์ ํ์ด
#include <iostream>
using namespace std;
int nlist[2001] = {0};
int dp[2001][2001] = {0};
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n; int m;
cin >> n;
for (int i = 1; i <= n; ++i){
cin >> nlist[i];
}
for (int i = 1; i < n; ++i){
dp[i][i] = 1;
if(nlist[i]==nlist[i+1]) {
dp[i][i+1] = 1;
}
}
dp[n][n] = 1;
for (int i = n; i > 0; --i){
for (int j = n; j >= i; --j){
if(nlist[i] == nlist[j] && dp[i+1][j-1] == 1) dp[i][j] = 1;
}
}
int s;
int e;
cin >> m;
for (int i = 0; i < m; ++i){
cin >> s >> e;
cout << dp[s][e]<<"\n";
}
}
์ค๋๋ง์ ๋๋ํ์ ๋นก์ธ๊ฒ ์์ผฐ๋๋ ํผ๊ณคํ๋ค
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++/BOJ] 1806 : ๋ถ๋ถํฉ (ํฌํฌ์ธํฐ) (0) | 2023.03.23 |
---|---|
[C++/BOJ] 2467 : ์ฉ์ก (ํฌํฌ์ธํฐ) (0) | 2023.03.22 |
[C++/BOJ] 12865 : ํ๋ฒํ ๋ฐฐ๋ญ (DP) / ํ ์คํธ์ผ์ด์ค ํฌํจ (1) | 2023.03.17 |
[C++/BOJ] 1890 : ์ ํ (DP) (1) | 2023.03.16 |
[C++/BOJ] 9251 : LCS (DP) (0) | 2023.03.16 |