UVa 164 - String Computer
题目:编辑距离。给你两个串,将已知串转化成目标串,能够增、删、改字母,求最小操作次数。
分析:dp,编辑距离。同最大公共子序列。
注意操作位置是实时变化的。
(前面都已经处理好了)
f[i][j] = f[i-1][j] 这时删掉 str1[i],位置j+1。
f[i][j] = f[i][j-1] 这时添加 str2[j]。位置j;
f[i][j] = f[i-1][j-1]+k 假设str1[i] == str2[j]这时同样k=0,否则k=1,位置j。
说明:注意是str1变成str2;变化位置是这一步时所在的位置(前面的都处理过了)。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio> char str1[24],str2[24];
int dp[24][24],op[24][24]; void output( int i, int j )
{
if ( !i && !j ) return;
if ( op[i][j] == 1 ) {
output( i-1, j );
printf("D%c%02d",str1[i-1],j+1);
}else if ( op[i][j] == 2 ) {
output( i, j-1 );
printf("I%c%02d",str2[j-1],j);
}else if ( op[i][j] == 3 ){
output( i-1, j-1 );
printf("C%c%02d",str2[j-1],j);
}else output( i-1, j-1 );
} int main()
{
while ( scanf("%s",str1) && str1[0] != '#' ) {
scanf("%s",str2);
int l1 = strlen(str1);
int l2 = strlen(str2);
for ( int i = 0 ; i <= l1 ; ++ i )
for ( int j = 0 ; j <= l2 ; ++ j ) {
dp[i][j] = 400;
op[i][j] = 0;
} //初始化
for ( int i = 0 ; i <= l1 ; ++ i ) {
op[i][0] = 1; dp[i][0] = i;
}
for ( int i = 0 ; i <= l2 ; ++ i ) {
op[0][i] = 2; dp[0][i] = i;
} for ( int i = 1 ; i <= l1 ; ++ i )
for ( int j = 1 ; j <= l2 ; ++ j ) {
if ( str1[i-1] != str2[j-1] ) {
op[i][j] = 3; dp[i][j] = dp[i-1][j-1]+1;
}else dp[i][j] = dp[i-1][j-1];
if ( dp[i-1][j]+1 < dp[i][j] ) {
op[i][j] = 1; dp[i][j] = dp[i-1][j]+1;
}
if ( dp[i][j-1]+1 < dp[i][j] ) {
op[i][j] = 2; dp[i][j] = dp[i][j-1]+1;
}
}
output( l1, l2 );
printf("E\n");
}
return 0;
}
UVa 164 - String Computer的更多相关文章
- 区间DP UVA 10739 String to Palindrome
题目传送门 /* 题意:三种操作,插入,删除,替换,问最少操作数使得字符串变成回文串 区间DP:有一道类似的题,有点不同的是可以替换,那么两端点不同的时候可以替换掉一个后成回文, 即dp[j+1][k ...
- 区间DP UVA 1351 String Compression
题目传送门 /* 题意:给一个字符串,连续相同的段落可以合并,gogogo->3(go),问最小表示的长度 区间DP:dp[i][j]表示[i,j]的区间最小表示长度,那么dp[i][j] = ...
- UVA 1351 - String Compression
题意: 对于一个字符串中的重复部分可以进行缩写,例如"gogogo"可以写成"3(go)",从6个字符变成5个字符.."nowletsgogogole ...
- UVA 10739 String to Palindrome(动态规划 回文)
String to Palindrome 题目大意:给出一个字符串s,现在可以进行3种操作(添加字母,删除字母,替换字母),将其变成回文串,求出最少的操作次数.比如abccda,可以用删除操作,删除b ...
- UVA 10739 String to Palindrome(dp)
Problem H String to Palindrome Input: Standard Input Output: Standard Output Time Limit: 1 Second In ...
- EOJ 1641/UVa The SetStack Computer
Background from Wikipedia: “Set theory is a branch of mathematics created principally by the German ...
- UVa 908 - Re-connecting Computer Sites
题目大意:有n个网站,由m条线路相连,每条线路都有一定的花费,找出连接所有线路的最小花费. 最小生成树问题(Minimal Spanning Tree, MST),使用Kruskal算法解决. #in ...
- 一位学长的ACM总结(感触颇深)
发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...
- jquery 、 JS 脚本参数的认识与使用
jquery . JS 脚本参数的认识与使用 如何使用jquery刷新当前页面 下面介绍全页面刷新方法:有时候可能会用到 window.location.reload(); //刷新当前页面. par ...
随机推荐
- python读写xml文件
python读取xml文件 xml文件是具有树状结构的,如果想要访问某个叶子结点,必须逐层获取其父结点,要读取某个叶子结点内容用text成员 使用前先加载xml工具包 try: import xml. ...
- 轻松学习LINUX系列教程推出
本系列多媒体教程已完成的博文: 1.轻松学习Linux之入门篇 http://chenguang.blog.51cto.com/350944/449214 2.轻松学习Linux之本地安装系统 (分区 ...
- ARK登录信息
101,389B,382:仙境353:中心岛380:畸变404:孤岛371:焦土487:灭绝 eaglexmw:389b[65493013] : 初级畸变,高级飞升,TEK全解(有380权限),黑鬼, ...
- Struts2 + MySQL 实现分页
代码结构: package com.action; import java.util.List; import java.util.Map; import com.bean.Pager; import ...
- nodemon 基本配置与使用
在开发环境下,往往需要一个工具来自动重启项目工程,之前接触过 python 的 supervisor,现在写 node 的时候发现 supervisior 在很多地方都有他的身影,node 也有一个 ...
- java中ThreadLocal类的使用
ThreadLocal是解决线程安全问题一个很好的思路,ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本,由于Key值不可重复, ...
- POJ 2484 A Funny Game 博弈论 对称博弈
http://poj.org/problem?id=2484 1和2时Alice必胜,3时Bob必胜,其他情况下Bob只需要在Alice取过之后取一次将剩下的硬币链平均分为两份,然后Alice怎么取B ...
- [xsy1144]选物品
题意:给定$a_{1\cdots n},b_{1\cdots n}$,询问是给定$l,r$,找出$a',b'$使得$\sum\limits_{i=l}^r\max(\left|a'-a_i\right ...
- 20162303实验四 Android程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 石亚鑫 学号:20162303 成绩: 2分 指导教师:娄嘉鹏 王志强 实验日期:5月26日 实验密 ...
- C++ Any 任意基础类型封装
下面是本人使用C++封装的一个针对任意基础类型以及用户自定义类型指针的通用类型.目的是为方便常用类型使用统一化及便利化.该类型的使用就与平时使用基础类型基本没什么差别.具体可参看以下代码及测试代码. ...