競技プログラミングノート

競技プログラミングで解いた問題を記録するだけ

POJ 3280 Cheapest Palindrome

POJは制約が多すぎる (unordered_mapが使えなかった)

問題概要

リンク

  • N種類の文字で構成された長さMの文字列Sが与えられる
  • この文字列にいくつかの文字を追加、あるいは削除して回文にする
  • i番目の文字を追加するには、a_iのコスト、削除するにはb_iのコストがかかる

解法

  • abbbbを回分にする時aを追加して、abbbbaとする方法と、aを削除してbbbbとする方法どちらでも可である
    • 従って、追加 or 削除はコストの低い方を用いる
  • dp[i][j]:=区間[i,j)を回文にするコストとすると
    • ある、長さlenの区間について
    • dp[i][j+1] = max(dp[i][j+1], dp[i][j]+S[j]のコスト)
    • dp[i-1][j] = max(dp[i-1][j], dp[i][j]+S[i-1]のコスト)
    • if (S[i-1]==S[j]) dp[i-1][j+1] = max(dp[i-1][j+1],dp[i][j])
  • 以上のdpを区間lenが0 ~ M-1の間繰り返す

参考

POJ 3280 - Cheapest Palindrome - プログラミングコンテストの記録