Period UVA - 1371

发布时间 2023-04-25 20:00:02作者: towboat

 

题意:

给两个串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;
 	}
 }