首页 > 其他 > 详细

DP - Codeforces Problem 1506C - Double-ended Strings

时间:2021-04-09 13:29:06      阅读:26      评论:0      收藏:0      [点我收藏+]
#include <bits/stdc++.h>
using namespace std;
const int N = 20+5;
int t;
int inf;
int maxlen;
int m, n;
char a[N], b[N];
int dp[N][N][N];
// dp[i][j][v] 表示a从i开始,b从j开始, 长度为v的两串相同, 所需耗费的最小删除次数
int main(){
	scanf("%d", &t);
	while(t--){
		scanf("%s%s", a+1, b+1);
		m = strlen(a+1);
		n = strlen(b+1);
		maxlen = min(m, n);
		inf = m+n;
		for(int i = 1; i <= m; ++i){
			for(int j = 1; j <= n; ++j){
				for(int v = 0; v <= maxlen; ++v){
					dp[i][j][v] = inf;
				}
			}
		}
		
		for(int i = 1; i <= m; ++i){
			for(int j = 1; j <= n; ++j){
				if(a[i] == b[j]){
					dp[i][j][1] = inf-2;
				}
			}
		}
		
		for(int v = 2; v <= maxlen; ++v){
			for(int i = 1; i + v - 1 <= m; ++i){
				for(int j = 1; j + v - 1 <= n; ++j){
					if(a[i+v-1] == b[j+v-1])
						dp[i][j][v] = dp[i][j][v-1] - 2;
				}
			}
		}
		
		
		int ans = inf;
		for(int i = 1; i <= m; ++i){
			for(int j = 1; j <= n; ++j){
				for(int v = 0; v <= maxlen; ++v){
					ans = min(ans, dp[i][j][v]);
				}
			}
		}
		
		printf("%d\n", ans);
	}
	return 0;
}

DP - Codeforces Problem 1506C - Double-ended Strings

原文:https://www.cnblogs.com/popodynasty/p/14635642.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!