P2758 编辑距离 简单DP

Description

要把两个字符串变成相同的字符串
一共可以利用以下三种操作:
1、把串中任意一个字符删去;
2、在串中任意一个位置插入一个字符;
3、把串中任意一个字符变成其他任意字符;
问至少要多少次操作才能让两个字符串相同?
(https://www.luogu.com.cn/problem/P2758)

Solution

状态:设\(F[i][j]\)为把\(s1[0]-s1[i - 1]\)变为\(s2[0]-s2[j - 1]\)所需要的步数。
对于\(f[i][j]\)若相等,直接转移;否则有三个转移:

  1. 从\(f[i - 1][j - 1]\) (把\(s1[i - 1]\)变为\(s2[j - 1]\))
  2. 从\(f[i - 1][j]\) (删掉\(s1[i - 1]\))
  3. 从\(f[i][j - 1]\)(\(s1\)最后填一个\(s2[j]\))
    其实删除和添加操作两个是等价的...删掉一个相当于给另一个字符串添加一个......
#include<bits/stdc++.h>
using namespace std;
char a[10000],b[10000];
int dp[10000][10000];

int main(){
    scanf("%s%s",a + 1,b + 1);
    int n = strlen(a + 1),
        m = strlen(b + 1);

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++){
            dp[i][0] = i;
            dp[0][j] = j;
            if(a[i] == b[j]) {
                dp[i][j] = dp[i - 1][j - 1];
                continue;
            }
            dp[i][j] = min(dp[i - 1][j - 1],min(dp[i][j - 1],dp[i - 1][j])) + 1;
        }
    cout << dp[n][m]; 

    return 0;
}

原文地址:https://www.cnblogs.com/FoxC/p/12388321.html

时间: 2024-10-31 16:36:59

P2758 编辑距离 简单DP的相关文章

51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k->s) sittin (e->i) sitting (->g) 所以k

洛谷——P2758 编辑距离

P2758 编辑距离 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字母! 输入输出格式 输入格式: 第一行为字符串A:第二行为字符串B:字符串A和B的长度均小于2000. 输出格式: 只有一个正整数,为最少字符操作次数. 输入输出样例 输入样例#1: 复制 sfdqxbw gfdgw 输出样例#1: 复制 4 dp 我们用f[i][j]表示a字

POJ 3250 Bad Hair Day 简单DP 好题

Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads. Each cow i has a sp

hdu1207 汉诺塔II 简单dp

本文出自:http://blog.csdn.net/svitter 题意:汉诺塔,多了一根柱子,问你寻找最快的移动次数. dp [ n ] = dp [ n - j ] * 2 + pow( 2, j ) - 1; 就是把j个汉诺塔移到一根上dp[ n - j ],然后就是普通的汉诺塔问题,即2^n - 1次移动, 然后把剩下的移动过去dp [ n - j ]. 注意pow(2, j )可能超出long long int范围.写二的次方的时候也可用移位算法. #include <iostream

POJ1088:滑雪(简单dp)

题目链接:  http://poj.org/problem?id=1088 题目要求: 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.求可以滑落的最长长度. 题目解析: 首先要先排一下序,因为只能高度递减才能滑行.之后就很简单了,就是简单DP. 即:要求的滑坡是一条节点递减并依次相邻的最长路径,可以先根据高度将所有的点进行排序,在i点的时候,遍历0~i-1个点(升序排序,i前面的点的高度一定小于等于i),取相邻点间的大的路径长度 代码如下: #include <iostream

hdu 1087 简单dp

思路和2391一样的.. <span style="font-size:24px;">#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int inf=(0x7f7f7f7f); int main() { int a; int s[10005]; int w[10005];

hdu1087 简单DP

I - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HD

2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题

听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到100即可 算最大GPA的时候,首先每个科目分配到60分,然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到85即可,如果还有REMAIN POINT,就FOR循环下来加到100上限即可 不会DP 阿 QAQ 过段时间得好好看DP了  =  = 于是默默的把这题标记为<水题集> //

Codeforces 41D Pawn 简单dp

题目链接:点击打开链接 给定n*m 的矩阵 常数k 下面一个n*m的矩阵,每个位置由 0-9的一个整数表示 问: 从最后一行开始向上走到第一行使得路径上的和 % (k+1) == 0 每个格子只能向或走一步 求:最大的路径和 最后一行的哪个位置作为起点 从下到上的路径 思路: 简单dp #include <cstdio> #include <algorithm> #include<iostream> #include<string.h> #include &