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). 对与一个牛的名字和所有添加或删除字母的费用,找出修改名字的最小的费用.空字符串也是一个合法的名字.

题解:

比较简单的DP。

f[i][j]表示把i到j变成回文的最少需要的花费,则

f[i][j]=min(f[i][j-1]+cost[s[j]],f[i+1][j]+cost[s[i]])

如果 s[i]==s[j] 则f[i][j]=min(f[i][j],f[i+1][j-1])

有两种方式来递推,一是从后往前,一是按长度递推,还可以写记忆化搜索。

代码:

  1. #include<cstdio>
  2.  
  3. #include<cstdlib>
  4.  
  5. #include<cmath>
  6.  
  7. #include<cstring>
  8.  
  9. #include<algorithm>
  10.  
  11. #include<iostream>
  12.  
  13. #include<vector>
  14.  
  15. #include<map>
  16.  
  17. #include<set>
  18.  
  19. #include<queue>
  20.  
  21. #include<string>
  22.  
  23. #define inf 1000000000
  24.  
  25. #define maxn 2500
  26.  
  27. #define maxm 500+100
  28.  
  29. #define eps 1e-10
  30.  
  31. #define ll long long
  32.  
  33. #define pa pair<int,int>
  34.  
  35. #define for0(i,n) for(int i=0;i<=(n);i++)
  36.  
  37. #define for1(i,n) for(int i=1;i<=(n);i++)
  38.  
  39. #define for2(i,x,y) for(int i=(x);i<=(y);i++)
  40.  
  41. #define for3(i,x,y) for(int i=(x);i>=(y);i--)
  42.  
  43. #define mod 1000000007
  44.  
  45. using namespace std;
  46.  
  47. inline int read()
  48.  
  49. {
  50.  
  51. int x=,f=;char ch=getchar();
  52.  
  53. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  54.  
  55. while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
  56.  
  57. return x*f;
  58.  
  59. }
  60. int n,m,a[maxn],b[maxn],f[maxn][maxn];
  61. char s[maxn];
  62.  
  63. int main()
  64.  
  65. {
  66.  
  67. freopen("input.txt","r",stdin);
  68.  
  69. freopen("output.txt","w",stdout);
  70.  
  71. m=read();n=read();
  72. scanf("%s",s+);
  73. for1(i,m)
  74. {
  75. char ch=' ';
  76. while(ch==' '||ch=='\n')ch=getchar();
  77. a[(int)ch]=min(read(),read());
  78. }
  79. for1(i,n)for1(j,n)f[i][j]=inf;
  80. for3(i,n,)
  81. {
  82. f[i][i]=;
  83. for2(j,i+,n)
  84. {
  85. f[i][j]=min(f[i][j-]+a[(int)s[j]],f[i+][j]+a[(int)s[i]]);
  86. if(s[i]==s[j]){if(j>i+)f[i][j]=min(f[i][j],f[i+][j-]);else f[i][j]=;}
  87. }
  88. }
  89. printf("%d\n",f[][n]);
  90.  
  91. return ;
  92.  
  93. }

刚开始还写了暴力找回文串。。。

  1. #include<cstdio>
  2.  
  3. #include<cstdlib>
  4.  
  5. #include<cmath>
  6.  
  7. #include<cstring>
  8.  
  9. #include<algorithm>
  10.  
  11. #include<iostream>
  12.  
  13. #include<vector>
  14.  
  15. #include<map>
  16.  
  17. #include<set>
  18.  
  19. #include<queue>
  20.  
  21. #include<string>
  22.  
  23. #define inf 1000000000
  24.  
  25. #define maxn 2500
  26.  
  27. #define maxm 500+100
  28.  
  29. #define eps 1e-10
  30.  
  31. #define ll long long
  32.  
  33. #define pa pair<int,int>
  34.  
  35. #define for0(i,n) for(int i=0;i<=(n);i++)
  36.  
  37. #define for1(i,n) for(int i=1;i<=(n);i++)
  38.  
  39. #define for2(i,x,y) for(int i=(x);i<=(y);i++)
  40.  
  41. #define for3(i,x,y) for(int i=(x);i>=(y);i--)
  42.  
  43. #define mod 1000000007
  44.  
  45. using namespace std;
  46.  
  47. inline int read()
  48.  
  49. {
  50.  
  51. int x=,f=;char ch=getchar();
  52.  
  53. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  54.  
  55. while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
  56.  
  57. return x*f;
  58.  
  59. }
  60. int n,m,a[maxn],b[maxn],f[maxn][maxn];
  61. char s[maxn];
  62.  
  63. int main()
  64.  
  65. {
  66. freopen("input.txt","r",stdin);
  67. freopen("output.txt","w",stdout);
  68. m=read();n=read();
  69. scanf("%s",s+);
  70. for1(i,m)
  71. {
  72. char ch=' ';
  73. while(ch==' '||ch=='\n')ch=getchar();
  74. a[(int)ch]=min(read(),read());
  75. }
  76. for1(i,n)for1(j,n)f[i][j]=inf;
  77. for1(i,n)
  78. {
  79. int j=;
  80. while(s[i-j]==s[i+j]&&i-j>&&i+j<=n)f[i-j][i+j]=,j++;
  81. }
  82. for1(i,n-)
  83. {
  84. int j=i,k=i+;
  85. while(s[j]==s[k]&&j>&&k<=n)f[j--][k++]=;
  86. }
  87. for1(l,n-)
  88. for1(i,n-l+)
  89. {
  90. int j=i+l;
  91. if(!f[i][j])continue;
  92. f[i][j]=min(f[i][j-]+a[(int)s[j]],f[i+][j]+a[(int)s[i]]);
  93. if(s[i]==s[j])f[i][j]=min(f[i][j],f[i+][j-]);
  94. }
  95. printf("%d\n",f[][n]);
  96.  
  97. return ;
  98.  
  99. }

1710: [Usaco2007 Open]Cheappal 廉价回文的更多相关文章

  1. BZOJ 1710: [Usaco2007 Open]Cheappal 廉价回文

    Description 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 &l ...

  2. 【BZOJ】1710: [Usaco2007 Open]Cheappal 廉价回文

    [算法]区间DP [题解]回文问题的套路做法:区间DP. f[i][j]表示区间i~j回文的最小代价,则有f[i][j]=min{①②③}. ①f[i+1][j]+min(a[s[i]],b[s[i] ...

  3. bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】

    只要发现添加一个字符和删除一个字符是等价的,就是挺裸的区间dp了 因为在当前位置加上一个字符x就相当于在他的对称位置删掉字符x,所以只要考虑删除即可,删除费用是添加和删除取min 设f[i][j]为从 ...

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

    [bzoj1710][Usaco2007 Open]Cheappal 廉价回文 Description 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过 ...

  5. BZOJ1710: [Usaco2007 Open]Cheappal 廉价回文

    len<=2000的字符串上,给出删掉和添加每种字符的花费,求把字符串变成回文串的最小花费. 首先每个字符添加和删除是一样的,因此花费在添加和删掉每个字符的花费中取小的. 如果每个字符的花费都是 ...

  6. bzoj1710【Usaco2007 Open】Cheappal 便宜回文

    1710: [Usaco2007 Open]Cheappal 便宜回文 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 466  Solved: 262 ...

  7. LeetCode[5] 最长的回文子串

    题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  8. 最长回文子串-LeetCode 5 Longest Palindromic Substring

    题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  9. [LeetCode] Longest Palindrome 最长回文串

    Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...

随机推荐

  1. ASP.NET JSON的序列化和反序列化 之 Newtonsoft.Json

    我们用到的类库为:Newtonsoft.Json,通过VS工具中NuGet程序包可以下载. 一:对象转json-序列化 public class Student { public int ID { g ...

  2. 处理移动端click事件300ms延迟的好方法—FastClick

    下载地址:https://github.com/ftlabs/fastclick 1.click事件为什么有延迟? “...mobile browsers will wait approximatel ...

  3. String的hashCode原理

    参考下面这篇文章: http://blog.csdn.net/steveguoshao/article/details/12576849 http://blog.csdn.net/mingli1986 ...

  4. CSS Pseudo-Element Selectors伪对象选择符

    一: CSS3将伪对象选择符(Pseudo-Element Selectors)前面的单个冒号(:)修改为双冒号(::)用以区别伪类选择符(Pseudo-Classes Selectors),但以前的 ...

  5. 02.[WPF]如何固定窗口的大小

    在WPF开发过程中碰到一个需求,要求保证窗口大小不变,即便是双击 titlebar 也不能改变窗口大小和位置.要实现这样的效果,需要执行如下步骤: 1,分别设置窗口的 Width/MaxWidth/M ...

  6. MSSQL批量替换网址字符串语句

    1.如何批量替换ntext字段里面的数据 问题描述: 我想把数据库中News表中的字段content中的一些字符批量替换. 我的content字段是ntext类型的. 我想替换的字段是content字 ...

  7. 文字超出DIV的边框

    已经给div设置了高宽,但是文字还是会戳出div而不是换行 鼓捣了一下好像是因为这个原因 如果全是 aaaaaaaaaaaaaaaaaaaaa 这样的纯英文,那么测试的时候是不会换行的,因为浏览器认为 ...

  8. c语言字符数组和指针的经典用法

    1.字符数组 许多情况下,对字符串的处理使用字符数组会更加方便,比如: 我觉得不改变字符串的原有顺序,对字符串进行删除等操作时,使用字符数组效果会更好. eg:给定字符串(ASCII码0-255)数组 ...

  9. 【vc】14_网络编程_socket编程

    1.计算机网络基本知识 最简单的网络程序如图: 提示:IP地址就相当于一个公司的总机号码,端口号就相当于分机号码.在打电话时,拨通总机后,还需要转到分机上. (1)协议 ·为进行网络中的数据交换(通信 ...

  10. Perl中级第四章课后习题

    1.下列表达式各表示什么不同的含义: $ginger->[2][1] ${$ginger[2]}[1] $ginger->[2]->[1] ${$ginger->[2]}[1] ...