POJ 3280--Cheapest Palindrome

题意:给定一字符串,可以在任何位置删除或者添加字符,使得字符串变为回文字符。但是每次操作的代价不同,问最小的代价。

题解:类似于POJ 1159。因为从a[i]到a[j]的子串变成的最少代价回文字符串头尾是a[i]或者a[j]或者都不是。

  1. 设dp[i][j]为从a[i]到a[j]组成的子串变成回文字符串的最小花费。
  2. 转移方程:如果 a[i] = a[j] ,dp[i][j] = dp[i+1][j-1];否则,dp[i][j] = min{dp[i+1][j]+cost[i],dp[i][j-1]+cost[j]}。其中cost为删除或者添加字符的较小值。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

class solve
{
private:
    char* initID;
    int N,M;
    int cost[26];
    int* minCost[2];
public:
    solve(int n,int m):N(n),M(m)
    {
        processIn();
        dp();
    }
    ~solve()
    {
        delete[] initID;
        delete[] minCost[0];
        delete[] minCost[1];
    }
    int processIn();
    int dp();
};

int solve::dp()
{
    int i,j;
    char flag = 0;
    for(i = 0;i < 2;i++)
    {
        minCost[i] = new int[M];
        memset(minCost[i],0,sizeof(int)*M);
    }
    for(i = M-1;i >= 0;i--)
    {
        for(j = i+1;j < M;j++)
        {
            if(initID[i] == initID[j])
            {
                minCost[!flag][j] = minCost[flag][j-1];
            }
            else
            {
                minCost[!flag][j] = min(minCost[flag][j]+cost[initID[i]-'a'],minCost[!flag][j-1]+cost[initID[j]-'a']);
            }
        }
        flag = !flag;
    }
    printf("%d\n",minCost[flag][M-1]);
    return 0;
}

int solve::processIn()
{
    char c;
    int cost1,cost2;
    initID = new char[M+1];
    scanf("%s",initID);
    while(N--)
    {
        getchar();
        scanf("%c%d%d",&c,&cost1,&cost2);
        cost[c-'a'] = min(cost1,cost2);
    }
    return 0;
}

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        solve poj_3280(n,m);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值