leet code WC439์ ๋์จ palindrome ๋ฌธ์ ์ด๋ค. ์ฃผ์ ํฌ์ธํธ๋ 2๊ฐ์ง๋ก ๋งํ ์ ์๋ค.
- subsquence ๋ฌธ์ ๋ DP ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ ค ๋ณผ ๊ฒ.
- ๋ง์ฝ DP๋ก ์ ๊ทผํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ , 2์ฐจ์ ๋ฐฐ์ด์ ๋๊ณ DP๋ฌธ์ ๋ก ๊ฐ์ ํ์ ๋, bottom-up ๋ฐฉ์์ด๋ผ๋ฉด 2์ฐจ์ ๋ฐฐ์ด DP์์๋ ๋จผ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์๊ฐํ ์ค ์์์ผ ํ๋ค.

์ 2๊ฐ์ง ํฌ์ธํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ข ๋ ์ฝ๊ฒ ๋ฌธ์ ๋ฅผ ํ ์ ์์ ๊ฒ์ด๋ค.
class Solution:
def longestPalindromicSubsequence(self, s: str, k: int) -> int:
def cost(c1, c2):
dist = abs(ord(c1) - ord(c2))
return min(dist, 26-dist)
# k + 1 because we store 0 to k
n = len(s)
dp = [[[0 for _ in range(k+1)] for _ in range(n)] for _ in range(n)]
for i in range(n):
for kk in range(k+1):
# single character is palindrome
dp[i][i][kk] = 1
for i in range(n-1, -1, -1):
for j in range(i+1, n):
# print("i, j", i, j)
for kk in range(k+1):
if s[i] == s[j]:
dp[i][j][kk] = dp[i+1][j-1][kk] + 2
else:
dp[i][j][kk] = max(dp[i+1][j][kk], dp[i][j-1][kk])
d = cost(s[i], s[j])
if d <= kk:
dp[i][j][kk] = max(dp[i][j][kk], dp[i+1][j-1][kk-d] + 2)
return dp[0][n-1][k]
...