RQNOJ 字串距离

点击打开链接

思路: 线性动态规划
分析:
1 题目要求两个字符串的最小距离
2 假设dp[i][j]表示字符串1前i个字符和字符串2的前j个字符的最小距离,那么我们很容易知道。dp[0][0] = 0,因为两个空的字符串的距离为0
dp[0][j] = dp[0][j-1]+k , dp[i][0] = dp[i-1][0]+k
3 那么很明显考虑字符串1第i个字符和字符串2的第j个字符的时候,那么我们可以知道有三种情况,i字符和j字符匹配,i字符和空字符匹配,j字符和空字符匹配。那么就有dp[i][j] = min(dp[i-1][j-1]+abs(str1[i]-str2[j] , dp[i-1][j]+k  , dp[i][j-1]+k ));
4 我们为了计算的方便把字符串从下标1读入,那么ans就是dp[len1][len2];

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int INF = 0x3f3f3f3f;
const int MAXN = 2010;
char str1[MAXN] , str2[MAXN];
int k , dp[MAXN][MAXN];

int solve(){
    int len1 = strlen(str1+1);
    int len2 = strlen(str2+1);
    memset(dp , INF , sizeof(dp));
    dp[0][0] = 0;
    for(int i = 1 ; i <= len2 ; i++)
        dp[0][i] = dp[0][i-1]+k;
    for(int i = 1 ; i <= len1 ; i++)
        dp[i][0] = dp[i-1][0]+k;

    for(int i = 1 ; i <= len1 ; i++){
        for(int j = 1 ; j <= len2 ; j++){
            int tmp = dp[i-1][j-1]+abs(str1[i]-str2[j]);
            tmp = min(tmp , dp[i-1][j]+k);
            tmp = min(tmp , dp[i][j-1]+k);
            dp[i][j] = min(dp[i][j] , tmp);
        }
    }
    return dp[len1][len2];
} 

int main(){
    while(scanf("%s" , str1+1) != EOF){
        scanf("%s" , str2+1);
        scanf("%d" , &k);
        printf("%d\n" , solve());
    }
    return 0;
}
时间: 2024-07-31 05:02:49

RQNOJ 字串距离的相关文章

java MD5算法返回数字型字串

算法   常有人问及MD5算法为何有些程序片断返回完全数字型结果而有些返回数字与字母的混合字串. 其实两种返回结果只是因为加密结果的不同显示形式,Blog中已经有.Net的实现,在此附加JAVA实现,供参考. JAVA的标准类库理论上功能也很强大,但由于虚拟机/运行时的实现太多,加之版本差异,有些代码在不同环境下运行会出现奇怪的异常结果,尤其以涉及字符集的操作为甚. package com.bee.framework.common; import java.security.MessageDig

【算法趣题】产生随机DNA序列(字串)

[题目说明]写一段程序(不限语言),能够按要求产生随机DNA序列(字串). DNA序列由A.T.C.G四种碱基(字符)组成.现要求按A 10%, T 20%, C 30%, G 40% 的比例产生长度为100个碱基的DNA序列. 注意要随机程度好,且符合比例要求. 我先抛砖引玉了:(大家最好先别看我的程序,否则可能会影响你自己的思路) 以下是HTML网页特效代码,点击运行按钮可查看效果: [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

Unicode控件的字串参数问题

控件|问题 写Unicode控件时发现的传字串参数的问题:问题描述:   Unicode的OCX,属性参数Text,类型:BSTR.   控件的源码(VC中)   afx_msg void SetText(LPCTSTR lpszText)    VB调用1:   Dim strTest As String    strTest = Text1.Text       'Text1文本框为空    If Not IsNull(strTest) Then       TestOCX2221.stri

关于jet db的连接字串,以及加密后的字串

加密 关于jet db的连接字串,以及加密后的字串   问题: 关于jet db的连接字串,以及加密后的字串ADO连接MDB文件的字串如何写?加密以后如何写?  回答: access数据库加密分3种以下以access xp为例 1.工具 -> 安全-> 加密/解密数据库,打开时无需任何更改 2.工具 -> 安全-> 设置数据库密码,打开密码为 1 打开时需要使用"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\1.mdb;U

返回字串的拼音首字母

拼音 //////////////////////////////////////////////////////////////file://函数名:gf_getfirstletter(string)file://功能:返回字串的拼音首字母,支持混合字符串(可以包含非汉字)file://参数:as_inputstringfile://返回值:stringfile://created 大同 张和平 dtzhp@yeah.net///////////////////////////////////

PHP编程:探索字串的奥秘

编程 在许多Web编程里,字符串总是会被大量地生成和处理的.正确地使用和处理字符串,对于PHP程 序员来说也同样越来越重要了.本文从最简单的字符串定义一直引导你到高层字符串处理技巧,希望 对大家有所帮助. 一.引号定义字符串 在PHP中,通常一个字符串被定义在一对引号中,如: 'I am a string in single quotes' "I am a string in double quotes" PHP语法分析器是用成对的引号来判断一个字符串的.因此,所有字符串必须使用同一种

取得TextBox某一行的字串

这是使用EM_GETLINE message来做,比较奇特的是lParam是指向一个字串所在的位置,但是该字串传入时,前两个Byte要存该字串允许的最大长度. '以下在Form需一个TextBox,并设定MultiLine = True, 一个Command Button Private Sub Command1_Click() Dim str5 As String str5 = GetaLine(Text1,1) '取得第二行的字串,以0为基底 End Sub '以下在.Bas Option

C++语言基础-字串操作函数

如果你用过具有string数据类型的编程语言,你可能很不习惯,别人也有同感,所以标准C语言库中提供了几个字串操作函数.表1.3列出了最常用的字串操作函数及其用法说明.关于每个函数的详细说明和实例,见C++ Builder联机帮助. 表1.3字串操作函数 函数 说明 strcat() 将字串接合到目标字串的末尾 strcmp() 比较两个字串是否相等 strcmpi() 比较两个字串是否相等,不考虑大小写 strcpy() 将字串内容复制到目标字串中 strstr() 扫描字串中第一个出现的字串

java不变字串

请观察下述代码:   //: Stringer.java public class Stringer { static String upcase(String s) { return s.toUpperCase(); } public static void main(String[] args) { String q = new String("howdy"); System.out.println(q); // howdy String qq = upcase(q); Syste