您的位置:首页 > 其它

uva 10739 String to Palindrome

2013-05-14 20:26 375 查看
import java.math.BigInteger;
import java.util.*;

public class Main{
public static void dp(String s,int cases){
int table[][] = new int[s.length()][s.length()];
for(int i=0;i<s.length();i++){
for(int j=i+1;j<s.length();j++)
table[i][j] = 9999999;
}
for(int gap = 1;gap<s.length();gap++){
for(int i=0;i+gap<s.length();i++){
int j = i+gap;
if(s.charAt(i)==s.charAt(j)){
table[i][j] = table[i+1][j-1];
}else{
table[i][j] = Math.min(table[i+1][j]+1,Math.min(table[i+1][j-1]+1,table[i][j-1]+1));
}
}
}
System.out.println("Case "+cases+": "+table[0][s.length()-1]);
}
public static void main (String [] args) throws Exception {
Scanner scan = new Scanner(System.in);
int cases = scan.nextInt();
for(int i=0;i<cases;i++){
String s = scan.next();
dp(s,i+1);
}
}
}

这两天状态不好,生活工作上遇到一些困难。准确的说不是一点,是一个比较大的问题,但是对我目前的生活没有太大的影响,是一个长期的问题。

所以生活还是继续下去,A题也继续下去。但是问题始终还是存在的,问题就在那里,影响着我的心理,所以写题目的状态也受到了影响。

不管怎么样吧,都得硬着头皮上,我需要胜利,彻底的胜利。希望我不会让我自己失望吧。

这题做的还不错,写加思考20分钟 1Y

简单介绍一下思维,假设我们已经有一个 Palindrome的字符串了, 这个字符串从i开始j结束,记做S[i][j].

那么对于增长一位的新字符串s[i][j+1], 有以下几种情况。

1. 如果第j+1位的字符和第i位相等,那么就缩小范围,s[i][j+1] = s[i+1][j];

2.如果不等,那么就是三种状态,增加,删除和改变。分别做坐标的改变就是了。

其实对于新手,我认为其实解空间的构造是比较难想的,但是这个解空间属于经典dp里面的一类,所以经验多了应该能想到。

顺带说一句poj的3280,那是一个增强版本的这个题目,简单的来说就是增加,删除和修改花费的代价是不一样的,然后求最小代价。

其实也不难,就是这里都是加1,那个题目加上不同的代价就是了。~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: