您的位置:首页 > 其它

POJ 3280--Cheapest Palindrome

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

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

设dp[i][j]为从a[i]到a[j]组成的子串变成回文字符串的最小花费。
转移方程:如果 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: