码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

时间:2018-04-17 00:49:34      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:#define   algorithm   clr   字符   ref   double   lse   art   code   

题目链接:http://poj.org/problem?id=3280

题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费。
解题思路:
比较简单的区间DP,令dp[i][j]表示使[i,j]回文的最小花费。
则得到状态转移方程:
dp[i][j]=min(dp[i][j],min(add[str[i]-‘a‘],del[str[i]-‘a‘])+dp[i+1][j]);
dp[i][j]=min(dp[i][j],min(add[str[j]-‘a‘],del[str[j]-‘a‘])+dp[i][j-1]);
if(str[i]==str[j])
dp[i][j]=min(dp[i][j],dp[i+1][j-1]);

代码:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cctype>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<set>
10 #include<map>
11 #include<stack>
12 #include<string>
13 #define lc(a) (a<<1)
14 #define rc(a) (a<<1|1)
15 #define MID(a,b) ((a+b)>>1)
16 #define fin(name)  freopen(name,"r",stdin)
17 #define fout(name) freopen(name,"w",stdout)
18 #define clr(arr,val) memset(arr,val,sizeof(arr))
19 #define _for(i,start,end) for(int i=start;i<=end;i++)
20 #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
21 using namespace std;
22 typedef long long LL;
23 const int N=3e3+5;
24 const int INF=0x3f3f3f3f;
25 const double eps=1e-10;
26 
27 int add[30],del[30];
28 int dp[N][N];
29 char str[N];
30 
31 int main(){
32     FAST_IO;
33     int n,m;
34     while(cin>>n>>m){
35         memset(dp,0,sizeof(dp));
36         cin>>str;
37         for(int i=1;i<=n;i++){
38             char ch;
39             int v1,v2;
40             cin>>ch>>v1>>v2;
41             add[ch-a]=v1;
42             del[ch-a]=v2;
43         }
44         for(int len=1;len<m;len++){
45             for(int i=0;i+len<m;i++){
46                 int j=len+i;
47                 dp[i][j]=INF;
48                 dp[i][j]=min(dp[i][j],min(add[str[i]-a],del[str[i]-a])+dp[i+1][j]);
49                 dp[i][j]=min(dp[i][j],min(add[str[j]-a],del[str[j]-a])+dp[i][j-1]);
50                 if(str[i]==str[j]){
51                     dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
52                 }
53             }
54         }
55         printf("%d\n",dp[0][m-1]);
56     }
57     return 0;
58 }

 

POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

标签:#define   algorithm   clr   字符   ref   double   lse   art   code   

原文地址:https://www.cnblogs.com/fu3638/p/8860358.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!