zoukankan      html  css  js  c++  java
  • 区间DP——低价回文

    K. 低价回文

    内存限制:128 MiB    时间限制:1000 ms    标准输入输出
    题目类型:传统    评测方式:文本比较

    题目描述

    追踪每头奶牛的去向是一件棘手的任务,为此农夫约翰安装了一套自动系统。他在每头牛身上安装了一个电子身份标签,当奶牛通过扫描器的时候,系统可以读取奶牛的身份信息。目前,每个身份都是由一个字符串组成的,长度为M (1≤M≤2000),所有的字符都取自小写的罗马字母。

    奶牛们都是顽皮的动物,有时她们会在通过扫描器的时候倒着走,这样一个原来身份为abcb的奶牛就可能有两个不同的身份了(abcb和bcba),而如果身份是abcba的话就不会有这个问题了。

    约翰想改变奶牛们的身份,使他们不管怎么走读起来都一样。比如说,abcb可以在最后加个a,变成回文abcba;也可以在前面加上bcb,变成回文bcbabcb;或者去除字母a,保留的bcb也是一条回文。总之,约翰可以在任意位置删除或插入一些字符使原字符串变成回文。

    不巧的是,身份标签是电子做的,每增加或删除一个字母都要付出相应的费用(0≤代价≤10000)。给定一头奶牛的身份标签和增加或删除相关字母的费用,找出把原来字符串变成回文的最小费用。注意空字符串也是回文。

    输入格式

    第一行:两个用空格分开的整数:N和M 第二行:一个长度恰好为M的字符串,代表初始的身份标签 第三行到第N+2行:每行为一个用空格分开的三元组:其中包括一个字符和两个整数,分别表示增加或删除这个字符的费用

    输出格式

    第一行:只有一个整数,表示改造这个身份标签的最小费用

    样例

    样例输入

    3 4 
    abcb
    a 1000 1100
    b 350 700
    c 200 800
    

    样例输出

    900
    

    数据范围与提示

    如果在最后插入一个a,得到abcba,代价为1000;如果删除第一个a,得到bcb,代价为1100;如果在字符串的开头插入bcb,代价为350+200+350=900,这才是最优的做法

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int hang,n,dp[2019][2019]/*from j--i the min*/,ch[2019],did[30],x,y;
     7 char k[30],a[2019];
     8 int find (char b)
     9 {
    10     for(int i=1;i<=hang;i++)
    11     {
    12         if(b==k[i])return did[i];
    13     }
    14     return 0;
    15 }
    16 int main()
    17 {
    18     cin>>hang>>n;
    19     cin>>(a+1);
    20     for(int i=1;i<=hang;i++)
    21     {
    22         cin>>k[i]>>x>>y;
    23         did[i]=min(x,y);
    24     }
    25     for(int i=1;i<=n;i++)
    26     {
    27         ch[i]=find(a[i]);
    28     }
    29     for(int i=2;i<=n;i++)
    30     {
    31         for(int j=i-1;j>=1;j--)
    32         {
    33             dp[j][i]=0x3f;
    34             if(a[i]==a[j])
    35             {
    36                 dp[j][i]=dp[j+1][i-1];
    37             }
    38             else
    39             {
    40                 dp[j][i]=min(dp[j+1][i]+ch[j],dp[j][i-1]+ch[i]);
    41             }
    42         }
    43     }
    44     cout<<dp[1][n];
    45 }
  • 相关阅读:
    软连接
    libmysqlclient.so.18 not found 的解决方法
    查找某个文件并全部删除
    sudo passwd root:没有相关指令
    智能解析套件
    日志类封装
    windows安装mysql
    xshell报错Socket error Event: 32 Error: 10053
    appium简明教程(8)——那些工具
    appium简明教程(7)——Desired Capabilities详解
  • 原文地址:https://www.cnblogs.com/lihaolin/p/11289571.html
Copyright © 2011-2022 走看看