AtCoder Beginner Contest 185E Sequence Matching | 字符串dp

题目链接:https://atcoder.jp/contests/abc185/tasks/abc185_e

题目大意:

给出两个字符串,你可以删除两个字符串中的任意一个字母

最终目的是使得两个字符串的长度相同

定义权值x = 删除字符的总数,y = 最终字符串下A[i] != B[i]的位置总数

询问x+y的最小值

题目思路:

经典字符串dp了

考虑dp[i][k]表示字符串A的前i个,字符串的前B个,组成相同长度的字符串的前提下,x+y的最小值

那么对于任意的位置(i,k)

即有:

1.删除i 并且 保留k

2.删除k 并且 保留i

3.删除i 并且 删除k

4.保留i 并且 保留k

对四种情况枚举一下转移就好了,对于第三种情况不需要枚举,因为无意义

所以考虑一下边界条件就好了

这场ABCak啦

Code:

/*** keep hungry and calm CoolGuang!  ***/
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<string.h>
#include<iostream>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define d(x) printf("%lld\n",x);
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const ll INF= 1e18;
const ll maxn = 4e5+700;
const int mod= 1e9+7;
const int up = 1e9;
template<typename T>inline void read(T &a){char c=getchar();T x=0,f=1;while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}a=f*x;}
ll n,m,p;
ll dp[1005][1005];
ll a[maxn],b[maxn];
int main(){
    read(n);read(m);
    for(int i=1;i<=n;i++) read(a[i]);
    for(int i=1;i<=m;i++) read(b[i]);
    for(int i=1;i<=n;i++)
        for(int k=1;k<=m;k++)
            dp[i][k] = INF;
    dp[0][0] = 0;
    for(int i=1;i<=n;i++) dp[i][0] = i;
    for(int k=1;k<=m;k++) dp[0][k] = k;
    for(int i=1;i<=n;i++){
        for(int k=1;k<=m;k++){
            dp[i][k] = min(dp[i-1][k]+1,dp[i][k-1]+1);
            dp[i][k] = min(dp[i][k],dp[i-1][k-1]+(a[i]!=b[k]));
        }
    }
    ll ans = INF;
    printf("%lld\n",dp[n][m]);
    return 0;
}
/***
2 4
2 3
1 1 2 3
***/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只酷酷光儿( CoolGuang)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值