【动态规划】POJ3280- Cheapest Palindrome

【题目大意】

给出一个字符串,可以删除或添加一些字符,它们各自会消耗价值。问最少消耗多少价值,可以使得字符串变成回文的。

【思路】

事实上删除或添加字符的价值只需要保持较小的那一个。假设当前要将(j,i)转换为回文字符,那么它有以下三种情况:

(1)在结尾添加或删除一个和开头一样的字符,f[j][i-1]+cost[s[i]-'a'];

(2)在开头添加或删除一个和结尾一样的字符,f[j+1][i]+cost[s[j]-'a'];

(3)如果开头和结尾的字符本来就是一样的,就有f[j+1][i-1]。

【错误】

初始化均为0,不要设置成INF了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 const int MAXN=2000+50;
 7 int n,m;
 8 char s[MAXN];
 9 int f[MAXN][MAXN];
10 int cost[MAXN];
11 
12 int main()
13 {
14     scanf("%d%d",&n,&m);
15     getchar();
16     scanf("%s",s);
17     memset(f,0,sizeof(f));
18     for (int i=0;i<n;i++)
19     {
20         getchar();
21         char tempc;
22         int a,b;
23         scanf("%c%d%d",&tempc,&a,&b);
24         cost[tempc-'a']=min(a,b);
25     }
26 
27     for (int i=1;i<m;i++)
28         for (int j=i-1;j>=0;j--)
29         {
30             f[j][i]=min( f[j+1][i]+cost[s[j]-'a'] , f[j][i-1]+cost[s[i]-'a']);
31             if (s[j]==s[i]) f[j][i]=min(f[j][i],f[j+1][i-1]);
32         }
33     cout<<f[0][m-1]<<endl;
34     return 0;
35 }

 

posted @ 2015-09-16 23:20  iiyiyi  阅读(143)  评论(0编辑  收藏  举报