zoukankan      html  css  js  c++  java
  • BZOJ 1710: [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

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

    题解:

    对于一个回文串来说,添加一个字符,与删去原有字符是等价的,所以价格可以取 min。

    然后区间dp,`O(n^2)`。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
     
    //by zrt
    //problem:
    using namespace std;
    typedef long long LL;
    const int inf(0x3f3f3f3f);
    const double eps(1e-9);
    int n,m,cost[30];
    char s[2100];
    int f[2100][2100];
    int main(){
        #ifdef LOCAL
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
        #endif
        scanf("%d%d%s",&n,&m,s+1);
        for(int i=1,x,y;i<=n;i++){
            char tmp[5];
            scanf("%s%d%d",tmp,&x,&y);
            cost[tmp[0]-'a']=min(x,y);
        }
        memset(f,0x3f,sizeof f);
        for(int i=1;i<=m;i++) s[i]-='a',f[i][i]=0,f[i+1][i]=0;
        for(int l=1;l<=m;l++){
            for(int i=1;i<=m;i++){
                int j=i+l;
                if(j>m) break;
                f[i][j]=min(f[i][j-1]+cost[s[j]],f[i+1][j]+cost[s[i]]);
                if(s[i]==s[j]) f[i][j]=min(f[i][j],f[i+1][j-1]);
            }
        }
        printf("%d
    ",f[1][m]);
        return 0;
    }
  • 相关阅读:
    PAT (Advanced Level) Practice 1071 Speech Patterns (25分)
    PAT (Advanced Level) Practice 1070 Mooncake (25分)
    PAT (Advanced Level) Practice 1069 The Black Hole of Numbers (20分)
    PAT (Advanced Level) Practice 1074 Reversing Linked List (25分)
    PAT (Advanced Level) Practice 1073 Scientific Notation (20分)
    第一次冲刺个人总结01
    构建之法阅读笔记01
    人月神话阅读笔记01
    四则运算2
    学习进度条(软件工程概论1-8周)
  • 原文地址:https://www.cnblogs.com/zrts/p/bzoj1710.html
Copyright © 2011-2022 走看看