【动态规划】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 }