dp,类似于求最长公共子序列

删括号

http://www.nowcoder.com/questionTerminal/251e3a6732e945188c95173bd60707db

dp[i][j]代表s[0-i-1]是否能删成t[0-j-1],两种情况:

  1. s末尾为右括号,则尝试删去s末尾的一个有效括号序列后缀;
  2. s,t两者末尾字符相同。
#include<bits/stdc++.h>

typedef long long ll;
typedef unsigned long long ull;
const int mod = 1e9+7;
using namespace std;

int main(){
    char s[101]{}, t[101]{};
    scanf("%s", s);
    scanf("%s", t);
    int sl = strlen(s), tl = strlen(t);
    bool dp[sl+1][tl+1]{};
    dp[0][0] = true;
    for(int i = 1; i <= sl; ++i) 
        for(int j = 1; j <= tl; j++){
            if(s[i-1] == t[j-1]) dp[i][j] |= dp[i-1][j-1];//末尾相同
            if(s[i-1] == ')'){//尝试删去s末尾的有效括号子串
                int k = i-1, p = 1;
                while(p > 0) p += (s[k-1] == ')' ? 1 : -1), k--;
                dp[i][j] |= dp[k][j];
            }

        }
    if(dp[sl][tl]) printf("Possible\n");
    else printf("Impossible\n");
    return 0;
}
全部评论
()(((()))) (((())))
1 回复
分享
发布于 2020-12-21 02:23
j应该从0开始吧
点赞 回复
分享
发布于 2022-01-18 17:56
联想
校招火热招聘中
官网直投

相关推荐

比亚迪 求帮选offer 12k*1.36*12 双非硕
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务