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,布布扣,bubuko.com

时间: 2024-11-05 19:06:22

UVa 164 - String Computer的相关文章

uva 10981 - String Morphing(记忆化+离散)

题目链接:uva 10981 - String Morphing 题目大意:给出一个规则,表示由两个字符可以变成一个字符(题目中的表),然后给出一个字符串A,问如何同过规则变换得到B串,输出过程. 解题思路:记忆化搜索,每次枚举当前串可以变换的位置,然后记录下来,用map映射设,有个剪枝就是找到B串就可以结束搜索了.然后在从B串回溯输出答案. #include <cstdio> #include <cstring> #include <iostream> #includ

UVa 908 - Re-connecting Computer Sites

题目:有一些电脑,电脑间由一些线路连接.现在给你电脑间的连接状态,以及原来选取的网络线路. 在此基础上加入了K条新线路,要从里面选取新的网络,使得电脑都连通并且线路长度和最小. 分析:图论.最小生成树. 说明:每组数据间有空行. #include <algorithm> #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> using namespace

区间DP UVA 1351 String Compression

题目传送门 1 /* 2 题意:给一个字符串,连续相同的段落可以合并,gogogo->3(go),问最小表示的长度 3 区间DP:dp[i][j]表示[i,j]的区间最小表示长度,那么dp[i][j] = min (dp[j][k] + dp[k+1][i+j-1]), 4 digit (i / k) + dp[j][j+k-1] + 2)后者表示可以压缩成k长度连续相同的字符串 4.5 详细解释 5 */ 6 /*****************************************

uva 10739 String to Palindrome (dp)

uva 10739 String to Palindrome 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 a

UVA 10981 - String Morphing(记忆化搜索)

题目链接:10981 - String Morphing 题意:给定开始的字符串,要求根据表格变化成一个字符串,问变化的顺序(注意,不一定要最少步数) 思路:记忆化搜索,用map来存字符串的状态,一开始按最少步数去做TLE,其实只要找到一个符合的就可以了 代码: #include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <map> u

区间DP UVA 10739 String to Palindrome

题目传送门 1 /* 2 题意:三种操作,插入,删除,替换,问最少操作数使得字符串变成回文串 3 区间DP:有一道类似的题,有点不同的是可以替换,那么两端点不同的时候可以替换掉一个后成回文, 4 即dp[j+1][k-1] + 1,还有这道题没有要求打印 5 */ 6 /************************************************ 7 * Author :Running_Time 8 * Created Time :2015-8-17 15:45:22 9 *

UVA 10739 String to Palindrome(DP)

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 characte

UVA 4394 - String painter(字符串区间DP)

String painter                           Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu Description There are two strings A and B with equal length. Both strings are made up of lower case letters. Now you have a powerful string

UVa 10739 - String to Palindrome

题目:给你一个字符串,可以进行增删改三种操作,问变成回文串最少的操作次数. 分析:动态规划,dp,LCS.可以利用区间dp求解,这里利用LCS求解更快. 利用字符串和自己的翻转求最大公共子序列,然后枚举所有的dp[i][len-i], 找最小的即可.注意可能最小值在dp[i-1][len-i],即str[i]为中间元素,不用匹配. 说明:注意dp的初始化赋值. #include <cstring> #include <cstdio> int dp[1001][1001]; int