zoukankan      html  css  js  c++  java
  • POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

    题目链接: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
    ",dp[0][m-1]);
    56     }
    57     return 0;
    58 }
  • 相关阅读:
    Matlab从入门到精通 Chapter5 数据可视化
    给source insight添加.cc的C++文件后缀识别
    机构研究报告
    配置Haproxy
    Ceph:一个 Linux PB 级分布式文件系统
    Centos安装源包出错Package xxx.rpm is not signed
    [虚拟机] 小实验: 使用KVM虚拟机,安装一个windows系统
    关于北京地铁通车计划
    python字符串和数字的基本运算符 valar
    python种类 valar
  • 原文地址:https://www.cnblogs.com/fu3638/p/8860358.html
Copyright © 2011-2022 走看看