ํฐ๋ฆฐ๋๋กฌ? ์ฑ๊ณต
0.5 ์ด (ํ๋จ ์ฐธ๊ณ ) 256 MB 40203 11389 7741 29.399% ๋ฌธ์
๋ช ์ฐ๋ ํ์ค์ด์ ํจ๊ป ํฐ๋ฆฐ๋๋กฌ ๋์ด๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค.
๋จผ์ , ํ์ค์ด๋ ์์ฐ์ 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์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
7 1 2 1 3 1 2 1 4 1 3 2 5 3 3 5 7
์์ ์ถ๋ ฅ 1 ๋ณต์ฌ
1 0 1 1โ
ํ ๋ฆฐ๋๋กฌ์ ๊ท์น์ ์ฐพ์๋ด์ผ ํ๋ ๋ฌธ์ ์ด๋ค.
S๋ฒ์งธ ์ ๋ถํฐ E๋ฒ์งธ ์๊ฐ ํ ๋ฆฐ๋๋กฌ์ธ์ง ๋ํ๋ด๋ ๋ณ์๋ฅผ arr[S][E]๋ผ ํ๊ณ , ์ ๋ ฅ๋ฐ์ ์์ด์ numarr[]๋ผ ํ๋ฉด
S = E, S+1 = E and numarr[S+1] = numarr[E], numarr[S] = numarr[E] and arr[S+1][E-1] = true
์์ ์์ ํ ์ธ๊ฐ์ง ๊ฒฝ์ฐ์๋ง ํ ๋ฆฐ๋๋กฌ์ด ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ค๋ณต๋ ์ฐ์ฐ์ด ์๊ธฐ๋ฏ๋ก, DP๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ง๋ฉด ๋๋ค.
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int N,M,S,E,arr[2001],dp[2001][2001];
void func(int i, int j){
if(i == j){
dp[i][j] = 2;
return;
}
if(i+1 == j){
if(arr[i] == arr[j])
dp[i][j] = 2;
else
dp[i][j] = 1;
return;
}
if(dp[i+1][j-1] == 0){
func(i+1, j-1);
}
if(dp[i+1][j-1] == 1){
dp[i][j] = 1;
return;
}else if(dp[i+1][j-1] == 2 && arr[i] == arr[j]){
dp[i][j] = 2;
return;
}else if(dp[i+1][j-1] == 2 && arr[i] != arr[j]){
dp[i][j] = 1;
return;
}
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>N;
for(int i=1; i<=N; i++)
cin>>arr[i];
cin>>M;
for(int i=0; i<M; i++){
cin>>S>>E;
func(S, E);
cout<<dp[S][E]-1<<'\n';
}
// for(int i=1; i<=N; i++){
// for(int j=1; j<=N; j++)
// cout<<dp[i][j]<<' ';
// cout<<endl;
// }
}