1. 程式人生 > 實用技巧 >dp字串操作

dp字串操作

在雜誌社工作的小鵬在休息日突然接到老闆丟過來的文字編輯任務,要求將一串漏洞百出的文字A編輯為小鵬認為合理的文字B,小鵬一次可以對一個字元進行插入、刪除和替換操作,每種操作需要耗費的時間分別對應為xyz分鐘,然而小鵬一心只想看T分鐘後的英雄聯盟S10 全球總決賽,親眼見證最喜歡的大烏龜戰隊奪冠。問:小明是否可以準時觀看比賽?若可以,請告訴小明完成工作後還有多久開始比賽,否則輸出比賽已經開始了多久。

Input

A

B

XYZT

Output

Yes (or No) 和一個整數(如果時間準時看比賽,請輸出Yes 0)

Samples

InputCopy
abc
adc
5 3 2 2
Output
Yes 0

Hint

0<|A|,|B|<6000

1<x,y,z<10000

一看範圍就是n方的dp就行

dp轉移方程是:

dp[i][j]=0x3f3f3f;
dp[i][j]=min(dp[i][j],dp[i][j-1]+x);////插入 有可能(b長)
dp[i][j]=min(dp[i][j],dp[i-1][j]+y);//刪除 有可能不一樣長(比如a長)
if(a[i]==b[j]){
    dp[i][j]=min(dp[i][j],dp[i-1][j-1]); 
}
else{
    dp[i][j]=min(dp[i][j],dp[i-1][j-1]+z);
}

注意可能不是一樣長

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=6e3+100;
char a[maxn];
char b[maxn];
int dp[maxn][maxn];
int x,y,z,t;//插入、刪除和替換
int main(){
    scanf("%s",a+1);
    scanf("%s",b+1);
    scanf("%d%d%d%d",&x,&y,&z,&t);
    int
lenn=strlen(a+1); int lenm=strlen(b+1); for(int i=1;i<=lenm;i++){ dp[0][i]=i*x; } for(int i=1;i<=lenn;i++){ dp[i][0]=i*y; } for(int i=1;i<=lenn;i++){ for(int j=1;j<=lenm;j++){ dp[i][j]=0x3f3f3f; dp[i][j]=min(dp[i][j],dp[i-1][j]+y);//刪除 有可能不一樣長(比如a長) dp[i][j]=min(dp[i][j],dp[i][j-1]+x);//插入 有可能(b長) if(a[i]==b[j]){ dp[i][j]=min(dp[i][j],dp[i-1][j-1]); } else{ dp[i][j]=min(dp[i][j],dp[i-1][j-1]+z); } } } int z=dp[lenn][lenm]; if(z<=t){ printf("Yes %d",t-z); } else{ printf("No %d",z-t); } }