dp字串操作
阿新 • • 發佈:2020-11-19
在雜誌社工作的小鵬在休息日突然接到老闆丟過來的文字編輯任務,要求將一串漏洞百出的文字A編輯為小鵬認為合理的文字B,小鵬一次可以對一個字元進行插入、刪除和替換操作,每種操作需要耗費的時間分別對應為x,y,z分鐘,然而小鵬一心只想看T分鐘後的英雄聯盟S10 全球總決賽,親眼見證最喜歡的大烏龜戰隊奪冠。問:小明是否可以準時觀看比賽?若可以,請告訴小明完成工作後還有多久開始比賽,否則輸出比賽已經開始了多久。
Input
A
B
XYZT
Output
Yes (or No) 和一個整數(如果時間準時看比賽,請輸出Yes 0)
Samples
InputCopyabc adc 5 3 2 2Output
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); intlenn=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); } }