您的位置:首页 > 其它

poj 3280 Cheapest Palindrome dp(…

2013-04-14 19:39 274 查看
dp[t][s]表示t到s改变成回文串的最小代价
可以由dp[t+1][s],dp[t][s-1],dp[t+1][s-1]得来
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=2000+100,inf=99999999;
char a[maxn];
int turn[301][3],dp[maxn][maxn];
int text[maxn][maxn];

int min(int a,int b)
{
if(a<b)
return(a);
return(b);
}

int dfs(int t,int s)
{
if(text[t][s])
return(0);
text[t][s]=1;

if(t>s)
{

dp[t][s]=0;

return(0);
}
if(t==s)
{

dp[t][s]=0;

return(0);
}
dfs(t+1,s);
dfs(t,s-1);
int
sum1=min(turn[a[t]][1],turn[a[t]][2]);
int
sum2=min(turn[a[s]][1],turn[a[s]][2]);

dp[t][s]=min(dp[t+1][s]+sum1,dp[t][s-1]+sum2);
if(a[t]==a[s])
{

dfs(t+1,s-1);

dp[t][s]=min(dp[t][s],dp[t+1][s-1]);
}
}

int main()
{
int n,m;
scanf("%d
%d",&n,&m);
{

scanf("%s",&a[1]);

for(int i=1;i<=n;i++)

{

char
tmp[10];

scanf("%s",tmp);

scanf("%d
%d",&turn[tmp[0]][1],&turn[tmp[0]][2]);

}

for(int i=1;i<=m;i++)

for(int j=1;j<=m;j++)

dp[i][j]=inf;

memset(text,0,sizeof(text));

dfs(1,m);

int ans=dp[1][m];

printf("%d\n",ans);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: