题意:
给两个串A,B。现在把B串分为若干个部分,对每一个部分进行操作将其变为一个A串,代价为每部分操作次数的最大值
求最小代价
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N =5003,M=N;
#define int long long
const int inf =1e9 ;
char a[N],b[N] ;
int n,m,f[N][100];
bool chk(int md){
int i,j;
memset(f,127,sizeof f) ;
f[1][1]=(a[1]!=b[1]) ;
for(int j=2;j<=m;j++)
f[1][j] = min( f[1][j-1]+1,j-1+(a[1]!=b[j]));
for(i=2;i<=n;i++){
if(f[i-1][m]<=md){
f[i][1]=(a[i]!=b[1]) ;
}
for(j=1;j<=m;j++){
f[i][j]=min(f[i][j-1]+1,f[i][j]);
f[i][j]=min(f[i-1][j]+1,f[i][j]);
f[i][j]=min(f[i-1][j-1]+(a[i]!=b[j]),f[i][j]);
}
}
return f[n][m]<=md;
}
signed main(){
int tes;
cin>>tes; getchar();
while(tes--){
cin>>(b+1)>>(a+1); n=strlen(a+1); m=strlen(b+1);
int l=0,r=50 ;
int ans=0;
while(l<=r){
int md=(l+r)/2;
if(chk(md)) r=md-1,ans=md; else l=md+1;
}
cout <<ans<<endl;
}
}
浙公网安备 33010602011771号