POJ 3280 Cheapest Palindrome

제목 대의:
회문열로 바꾸는 데 필요한 최소한의 문자열을 보여 줍니다.
문제 해결 방법:
하나의 단독 문자에 대해 말하자면, 대칭 위치에 같은 새 자모를 삭제하는 것과 같은 효과가 있다.그래서 삭제할지 추가할지 고민할 필요 없어요.비용이 가장 적게 드는 조작만 사용하면 된다.
dp[i][j]는 i문자에서 j문자까지 회문열에 필요한 최소 비용을 나타낸다.이것은 dp[i+1][j]+의 i자 조작에 대한 최소 비용과 dp[i][j-1]+의 j자 조작에 대한 최소 비용 사이의 최소 값으로만 결정되며 i자 문자가 j자 문자와 같을 때 dp[i+1][j-1]을 더하면 세 개의 최소 값을 판단한다.
다음은 코드입니다.
#include <stdio.h>
char s[2005],c[3];
int dp[2005][2005],cost[27];
int min (int a,int b)
{
    if(a>b)a=b;
    return a;
}
int main()
{
    int n,m,t;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        scanf("%s",s);
        for(int i=0;i<n;i++)
        {
            scanf("%s",c);
            scanf("%d%d",&cost[c[0]-'a'],&t);
            if(t<cost[c[0]-'a'])cost[c[0]-'a']=t;
        }
        for(int i=0;i<m;i++)
        {
            dp[i][i]=0;
        }
        for(int i=m-1;i>=0;i--)
        {
            for(int j=i+1;j<m;j++)
            {
                dp[i][j]=min(dp[i+1][j]+cost[s[i]-'a'],dp[i][j-1]+cost[s[j]-'a']);
                if(s[i]==s[j])dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
            }
        }
        printf("%d
",dp[0][m-1]); } return 0; }

좋은 웹페이지 즐겨찾기