새소식

반응형
Algotithms

[백준] 1695 팰린드롬 만들기

  • -
728x90
반응형

문제

  • 앞에서 뒤로 보나, 뒤에서 앞으로 보나 같은 수열을 팰린드롬 이라고 한다.
  • 한 수열이 주어졌을 때, 최소 개수의 수를 끼워 넣어 팰린드롬을 만들려고 한다.
  • 최소 몇 개의 수를 끼워 넣으면 되는지 알아내기
  • 1 <= N <= 5000

 

풀이

  • dp[i][j] : i~j 문자열에서 팰린드롬으로 만들기 위해 끼워넣어야 하는 수의 개수
    • dp[i][i+1] ; arr[i] 과 arr[i+1] 이 같으면 0, 다르면 1
    • dp[2][4]
      • arr[2] == arr[4] ; arr[3][3] 과 같음
      • arr[2] != arr[4] ; arr[2][3]과 arr[3][4] 중에 더 작은 수 + 1
이대로 하면 메모리 초과가 뜸

 

  • 사실상 2개의 연속된 행만 보면 되므로 dp 테이블을 줄인다.
import sys
input = sys.stdin.readline

N = int(input())
arr = list(map(int, input().split()))

# dp
dp = [[0]* N for _ in range(2)]
for i in reversed(range(N)) :
    for j in range(i+1, N) :
        row = i % 2
        if arr[i] == arr[j] :
            dp[row][j] = dp[row-1][j-1]
        else :
            dp[row][j] = min(dp[row][j-1], dp[row-1][j]) + 1

print(dp[0][-1])

 

References

반응형

'Algotithms' 카테고리의 다른 글

[백준] 2668 숫자고르기  (0) 2023.11.02
[백준] 10994 별찍기 -19  (1) 2023.11.02
[백준] 11000 강의실 배정  (0) 2023.10.30
[백준] 9996 한국이 그리울 땐 서버에 접속하지  (0) 2023.10.26
[백준] 2224 명제 증명  (0) 2023.10.26
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.