zoukankan      html  css  js  c++  java
  • 【bzoj1710】[Usaco2007 Open]Cheappal 廉价回文

    【bzoj1710】[Usaco2007 Open]Cheappal 廉价回文

    Description

    为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 <= M <= 2,000) 由N (1 <= N <= 26) 个不同字母构成的字符串.很快,淘气的牛找到了系统的漏洞:它们可以倒着走过读 码器. 一头名字为”abcba”不会导致任何问题,但是名为”abcb”的牛会变成两头牛(“abcb” 和 “bcba”).农 夫JOHN想改变牛的名字,使得牛的名字正读和反读都一样.例如,”abcb”可以由在尾部添加”a”.别的方法包 括在头上添加”bcb”,得到”bcbabcb”或去掉”a”,得到”bcb”.JOHN可以在任意位置添加或删除字母.因为名字 是电子的,添加和删除字母都会有一定费用.添加和删除每一个字母都有一定的费用(0 <= 费用 <= 10,000). 对与一个牛的名字和所有添加或删除字母的费用,找出修改名字的最小的费用.空字符串也是一个合法的名字.

    Input

    * 第一行: 两个用空格分开的数, N 和 M.

    * 第二行: M个自符,初始的牛的名字.

    * 第3…N+2行: 每行含有一个字母和两个整数,分别是添加和删除这个字母的费用.

    Output

    一个整数, 改变现有名字的最小费用.

    Sample Input

    3 4
    abcb
    a 1000 1100
    b 350 700
    c 200 800
    输入解释:
    名字是 “abcb”, 操作费用如下:
    添加 删除
    a 1000 1100
    b 350 700
    c 200 800

    Sample Output

    900
    输出解释:
    在尾部添加”a”得到”abcba”的费用为1000. 删除头上的”a”,得到”bcb”的费用为1100.在头上添加”bcb”可以得到最小费用,350+200+350=900.

    题解

    加入一个数可以视为删除一个数,那么问题转化为删数回文串

    n^2dp即可

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstdlib>  
     4 #include<cstring>  
     5 #include<cmath>  
     6 #define F(i,j,n) for(int i=j;i<=n;i++)  
     7 #define D(i,j,n) for(int i=j;i>=n;i--)  
     8 #define ll long long  
     9 #define maxn 2005  
    10 using namespace std;  
    11 char s[maxn],ch;  
    12 int m,n,x,y;  
    13 int f[maxn][maxn],w[30];  
    14 inline int read()  
    15 {  
    16     int x=0,f=1;char ch=getchar();  
    17     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}  
    18     while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}  
    19     return x*f;  
    20 }  
    21 int main()  
    22 {  
    23     m=read();n=read();  
    24     scanf("%s",s+1);  
    25     F(i,1,m)  
    26     {  
    27         scanf("%c",&ch);while (ch<'a'||ch>'z') scanf("%c",&ch);  
    28         x=read();y=read();  
    29         w[ch-'a']=min(x,y);  
    30     }
    31     D(i,n-1,1) F(j,i+1,n)  
    32     {  
    33         f[i][j]=min(f[i+1][j]+w[s[i]-'a'],f[i][j-1]+w[s[j]-'a']);  
    34         if (s[i]==s[j]) f[i][j]=min(f[i][j],f[i+1][j-1]);  
    35     }  
    36     printf("%d
    ",f[1][n]);  
    37 }  
  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8143058.html
Copyright © 2011-2022 走看看