<span>codeforces 1272F dp+记录路径</span>

题意

给出两个括号序列 \(S\)\(T\),让你构造一个最短的合法括号序列使 \(S\)\(T\) 是它的子序列。

分析

\(dp[i][j][k]\) 为这个最短的合法括号序列的前缀包含 \(S\) 的前 \(i\) 个字符,T的前 \(j\) 个字符且左括号的数量大于右括号的数量为 \(k\)时的长度。

  • 如果我们要添加一个左括号

    \(dp[nexi][nexj][k+1]=min(dp[i][j][k]+1,dp[nexi][nexj][k+1])\)

    \(nexi\) 为添加一个左括号后能匹配到的下一个 \(i\)\(nexj\) 为添加一个左括号能匹配到的下一个 \(j\)

  • 如果我们要添加一个右括号

    \(dp[nexi][nexj][k-1]=min(dp[i][j][k]+1,dp[nexi][nexj][k-1])\)

    \(nexi\) 为添加一个右括号后能匹配到的下一个 \(i\)\(nexj\) 为添加一个右括号能匹配到的下一个 \(j\)

\(dp\) 过程中用一个数组记录下转移的前驱就可以倒推还原这个括号序列。

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define pb push_back
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=2e2+10;
char s[maxn],t[maxn];
int n,m;
int dp[maxn][maxn][2*maxn];
struct ppo{
	int x,y,k;
	char c;
}pre[maxn][maxn][2*maxn];
int main(){
	//ios::sync_with_stdio(false);
	//freopen("in","r",stdin);
	scanf("%s%s",s,t);
	n=strlen(s);m=strlen(t);
	for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k<2*maxn;k++) dp[i][j][k]=inf;
	dp[0][0][0]=0;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=m;j++){
			for(int k=0;k<2*maxn;k++){
				if(dp[i][j][k]==inf) continue;
				int x=i+(i<n&&s[i]=='(');
				int y=j+(j<m&&t[j]=='(');
				if(k+1<2*maxn&&dp[i][j][k]+1<dp[x][y][k+1]){
					dp[x][y][k+1]=dp[i][j][k]+1;
					pre[x][y][k+1]=ppo{i,j,k,'('};
				}
				x=i+(i<n&&s[i]==')');
				y=j+(j<m&&t[j]==')');
				if(k>0&&dp[i][j][k]+1<dp[x][y][k-1]){
					dp[x][y][k-1]=dp[i][j][k]+1;
					pre[x][y][k-1]=ppo{i,j,k,')'};
				}
			}
		}
	}
	string str;
	int x=n,y=m,k=0,p=0;
    for(int i=0;i<2*maxn;i++){
        if(dp[n][m][p]+p>dp[n][m][i]+i) p=i;
    }
    for(int i=0;i<p;i++) str.pb(')');
    k=p;
	for(int i=0;i<dp[n][m][p];i++){
		ppo p=pre[x][y][k];
		str.pb(p.c);
		x=p.x;y=p.y;k=p.k;
	}
	reverse(str.begin(), str.end());
	cout<<str<<endl;
	return 0;
}
全部评论

相关推荐

今天 15:40
华南理工大学 C++
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
03-09 19:13
求你们别卷了的大学生...:你不骂他,我就要骂你了
今天你投了哪些公司?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 大厂实习和小厂实习最大的区别是什么? #
2536次浏览 20人参与
# 参加完秋招的机械人,还参加春招吗? #
119973次浏览 761人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
18862次浏览 309人参与
# 牛友の3月总结 #
1951次浏览 30人参与
# 这些公司卡简历很严格 #
95211次浏览 417人参与
# 面试被问到不会的问题,你怎么应对? #
696次浏览 8人参与
# 米连集团26产品管培生项目 #
14511次浏览 291人参与
# 拼多多工作体验 #
52691次浏览 342人参与
# 研究所VS国企,该如何选 #
259073次浏览 2013人参与
# 通信硬件知识分享 #
48139次浏览 538人参与
# 找AI工作可以去哪些公司? #
17178次浏览 756人参与
# 从事AI岗需要掌握哪些技术栈? #
14990次浏览 852人参与
# 你做过最难的笔试是哪家公司 #
47602次浏览 763人参与
# 实习最想跑路的瞬间 #
130962次浏览 740人参与
# 金三银四,你的春招进行到哪个阶段了? #
24603次浏览 297人参与
# 说说你知道的学历厂 #
391012次浏览 1379人参与
# AI面会问哪些问题? #
36345次浏览 1081人参与
# 想给25届机械人的秋招建议 #
47745次浏览 251人参与
# 机械人避雷的岗位/公司 #
62887次浏览 395人参与
# 大厂无回复,继续等待还是奔赴小厂 #
343379次浏览 1988人参与
# 滴!实习打卡 #
814720次浏览 6858人参与
# 我心目中的理想工作是这样的 #
100878次浏览 907人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务