价值最小回文字符串

  题目大意:给你一个字符串,可以删除可以添加,并且每一次对一个字母的操作都带一个权,问你转成回文串最优操作数。

  如果这一题我这样告诉你,你毫无疑问知道这一题是LD(Levenshtien Distance 编辑距离),但是上面太多废话了,理解起来还是要有点费劲,比如我一开始就觉得回文串只能从头或者尾添加(英语吃了翔╮(╯▽╰)╭)。

  好吧,其实这一题不是水题(我的感觉),这一题挺好的,是一个带权的编辑距离问题,因为最后还是老问题,问你最小值,所以马上想到用二维矩阵,但是这一题首先要解决两个陷阱。

  第一个陷阱就是题目回文串,其实这一题和回文串关系都没有,就是在基准状态(空串或者一个字母的时候用到)。

  第二个陷阱就是删除和加入的问题,你仔细看一下题目给的条件,你会发现这两个权都是正的,这说明这两个操作都是等效的(有点像LD),最后要你找到最小值,所以我们只用关注最小的那个值就可以了

  但是回文串我们不可能全部枚举出来,而且LD要求的是固定字串,那么怎么办?其实我们可以这样,从最小开始,一个一个小串找,反正删除和加入都是等价操作,我们可以把这些操作的最小操作数都记录下来,那么最后要求的值就在dp[0][length-1]上了

  状态转移方程几乎和LD是一样的,只是少了input[j]!=input[i]时,与dp[i+1][j-1]的比较(这相当于修改了,修改也就是删除+加入,肯定不合理)

  dp[i][j]=dp[i+1][j-1]; input[i]==input[j];

  dp[i][j]=min{min(dp[i+1][j]+add[input[i]],dp[i][j]),dp[i][j-1]+add[input[j]]};

  

  参考:http://blog.csdn.net/y990041769/article/details/24259569

 #include <stdio.h>
#include <stdlib.h>
#define MAX_N 2001
#define MIN(a,b) ((a)<(b)?(a):(b)) static int word_dist[];
static char input[MAX_N];
static int dp[MAX_N][MAX_N]; void Search(const int, const int); int main(void)
{
int string_length, c_word_sum, i, tmp_add, tmp_de;
char tmp; while (~scanf("%d%d", &c_word_sum, &string_length))
{
getchar();//除掉回车
scanf("%s", input);
for (i = ; i < c_word_sum; i++)
{
getchar();//除掉回车
scanf("%c", &tmp);
scanf("%d%d", &tmp_add, &tmp_de);
word_dist[tmp - 'a'] = MIN(tmp_add, tmp_de);
}
Search(string_length, c_word_sum);
}
return ;
} void Search(const int string_length, const int c_word_sum)
{
//最后最小值会继承到dp[0][string_length - 1]
int i, j, k;
for (i = ; i < string_length; i++)
{
for (j = , k = i; k < string_length; j++, k++)
{
dp[j][k] = INT_MAX;
if (input[j] == input[k])
dp[j][k] = dp[j + ][k - ];
else
{
dp[j][k] = MIN(dp[j + ][k] + word_dist[input[j] - 'a'], dp[j][k]);
dp[j][k] = MIN(dp[j][k - ] + word_dist[input[k] - 'a'], dp[j][k]);
}
}
}
printf("%d\n", dp[][string_length - ]);
}

DP:Cheapest Palindrome(POJ 3280)的更多相关文章

  1. Cheapest Palindrome POJ - 3280

    Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate ...

  2. POJ 题目3280 Cheapest Palindrome(区间DP)

    Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7148   Accepted: 34 ...

  3. 【POJ】3280 Cheapest Palindrome(区间dp)

    Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10943   Accepted: 5 ...

  4. 【POJ - 3280】Cheapest Palindrome(区间dp)

    Cheapest Palindrome 直接翻译了 Descriptions 给定一个字符串S,字符串S的长度为M(M≤2000),字符串S所含有的字符的种类的数量为N(N≤26),然后给定这N种字符 ...

  5. poj 3280(区间DP)

    Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7869   Accepted: 38 ...

  6. Cheapest Palindrome(区间DP)

    个人心得:动态规划真的是够烦人的,这题好不容易写出了转移方程,结果超时,然后看题解,为什么这些题目都是这样一步一步的 递推,在我看来就是懵逼的状态,还有那个背包也是,硬是从最大的V一直到0,而这个就是 ...

  7. POJ3280 Cheapest Palindrome 【DP】

    Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6013   Accepted: 29 ...

  8. poj 3280【区间dp】

    poj 3280 题意:给定一个字符串和每个字符删去和增加的代价,求使字符串变成回文串操作所需的最小代价. 题解:哇!开心!终于亲自做对了!做完这两题这个就回了.uva10739  uva 10453 ...

  9. POJ 3280 Cheapest Palindrome(DP 回文变形)

    题目链接:http://poj.org/problem?id=3280 题目大意:给定一个字符串,可以删除增加,每个操作都有代价,求出将字符串转换成回文串的最小代价 Sample Input 3 4 ...

随机推荐

  1. 【POJ 3020】Antenna Placement(二分图匹配)

    相当于用1*2的板覆盖给定的h*w的格子里的点,求最少的板.可以把格子相邻的分成两个集合,如下图,0为一个集合,1的为一个,也就是(行数+列数)为奇数的是一个集合,为偶数的为另一个集合.1010101 ...

  2. groovy-保留字

    groovy的保留字: abstractasassertbooleanbreakbytecasecatchcharclassconstcontinuedefdefaultdodoubleelseenu ...

  3. php网站验证码的生成

    <?php header("Content-type:text/html;charset=utf-8"); header("Content-type:image/p ...

  4. dedecms网站栏目增加缩略图的方法-测试通过

    有时候因为网站功能需求,我们需要为织梦程序的栏目页添加缩略图功能,这里有一个栏目添加缩略图的方法,供大家参考 涉及到文件如下(注意备份): dede/catalog_add.php dede/cata ...

  5. 三大框架ssh

    一.hibernate a.实体类+映射 b.lib  hibernate包+oracle包(oracle安装里找) 映射:从类入手class+属性 a.映射的头文件在:hibernate3.jar- ...

  6. js ajax 向后台传递数组

    //定义数组 var _arrays = []; for (var i = 0; i < 10; i++) { _arrays.push(i); } //post $.post(href, {l ...

  7. linux ls和 ll 命令

    工作中用到      ll -alrth|tail -30    命令 所以再来回顾一下 ls 命令 linux ls和 ll 命令 ll 命令列出的信息更加详细,有时间,是否可读写等信息 ll命令和 ...

  8. 微信内置浏览器的 User Agent的判断

    如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mozilla/5.0 (iPhone; CPU ...

  9. Spring常用annotation标签

    @Service @Scope @Transactional @Autowired @Qualifier @PostConstruct @PreDestroy

  10. 八大常见内排序java实现

    虽然排序算法烂大街了,但是哥依然用java实现了一遍,只为自己练练手,后面可以时不时的回头看看...仅此而已,各位可以提意见,莫喷!! 一.冒泡排序 基本思想:在要排序的一组数中,对当前还未排好序的范 ...