Problem H
String to Palindrome

Input: Standard Input

Output: Standard Output

Time Limit: 1 Second

In this problem you are asked to convert a string into a palindrome with minimum number of operations. The operations are described below:

Here you’d have the ultimate freedom. You are allowed to:

  • Add any character at any position
  • Remove any character from any position
  • Replace any character at any position with another character

Every operation you do on the string would count for a unit cost. You’d have to keep that as low as possible.

For example, to convert “abccda” you would need at least two operations if we allowed you only to add characters. But when you have the option to replace any character you can do it with only one operation. We hope you’d be able to use this feature to your advantage.

Input

The input file contains several test cases. The first line of the input gives you the number of test cases, T (1≤T≤10). Then T test cases will follow, each in one line. The input for each test case consists of a string containing lower case letters only. You can safely assume that the length of this string will not exceed 1000 characters.

Output

For each set of input print the test case number first. Then print the minimum number of characters needed to turn the given string into a palindrome.

Sample Input                               Output for Sample Input

6
tanbirahmed
shahriarmanzoor
monirulhasan
syedmonowarhossain
sadrulhabibchowdhury
mohammadsajjadhossain

Case 1: 5

Case 2: 7

Case 3: 6

Case 4: 8

Case 5: 8

Case 6: 8

题意:给定一个字符串,可以进行添加,删除,和替换操作,求最少操作数使得该串变成回文串。

思路:i,j作为字符串的头尾。添加和删除操作其实是一样的。所以只需要考虑2种状态的转移了。

状态转移方程如果str[i] == str[j]则满足回文不用转换。dp[i][j] = dp[i + 1][j - 1]

如果不相等:dp[i][j] = min(min(dp[i + 1][j], dp[i][j - 1]), dp[i + 1][j - 1]) + 1

由于是递推。所以要从后往前。

代码:

#include <stdio.h>
#include <string.h> int t, i, j, dp[1005][1005], len;
char sb[1005]; int min(int a, int b) {
return a < b ? a : b;
} int main() {
scanf("%d%*c", &t);
int tt = 1;
while (t --) {
memset(dp, 0, sizeof(dp));
gets(sb);
len = strlen(sb);
for (i = len - 1; i >= 0; i --) {
for (j = i + 1; j < len; j ++) {
if (sb[i] == sb[j])
dp[i][j] = dp[i + 1][j - 1];
else
dp[i][j] = min(min(dp[i + 1][j], dp[i][j - 1]), dp[i + 1][j - 1]) + 1;
}
}
printf("Case %d: %d\n", tt ++, dp[0][len - 1]);
}
return 0;
}

最新文章

  1. ES6 will change the way you write JS code.
  2. 安装完ActivePython后Python的Idle窗口打不开也卸载不掉的解决方法
  3. C#编程之委托与事件四(二)【转】
  4. winform(数据导出、TreeView的使用)
  5. leach和leach-c协议仿真
  6. channelartlist标签调用实例
  7. Python2安装说明
  8. 安装Chive提示CDbConnection failed to open the DB connection.
  9. 模仿QQ客户端和服务器(支持window和linux)
  10. redis安装学习
  11. 安装mongodb后启动报错libstdc++
  12. .opt,frm,.MYD,.MYI文件如何转为.sql文件?
  13. PGM:部分观测数据
  14. Python——Django-应用的models.py内容
  15. day 34 编程之补充内容
  16. P4592 [TJOI2018]异或
  17. 练手nginx反向代理和负载均衡apache实战
  18. ReportMachine OCX
  19. 《FPGA那些事儿》原创教程总结
  20. SpringMvc(1) --Eclipse搭建web项目

热门文章

  1. USB接口的SmartCard Class协议标准:ICCD and CCID
  2. Python 2.7 学习笔记 中文处理
  3. Oracle Database 12c Release 1 Installation On Oracle Linux 6.4 x86_64
  4. Swift - 1 (常量、变量、字符串、数组、字典、元组、循环、枚举、函数)
  5. Treasure Exploration(二分最大匹配+floyd)
  6. mysql中怎样查看和删除唯一索引
  7. 饭卡------HDOJ杭电2546(还是01背包!!!!!!)
  8. python求微分方程组的数值解曲线01
  9. php上传文件,创建递归目录
  10. ISO C Random Number Functions