• 删括号(DP)


    链接:https://ac.nowcoder.com/acm/problem/21303
    来源:牛客网

    题目描述

    给你一个合法的括号序列s1,每次你可以删除一个"()"
    你可以删除0个或者多个"()"
    求能否删成另一个括号序列s2

    输入描述:

    第一行输入一个字符串s (2 ≤ |s| ≤ 100)
    第二行输入一个字符串t (2 ≤ |t| ≤ 100 )

    输出描述:

    如果可以输出"Possible"否则输出"Impossible"

    具体思路

    dp[i][j][k] 表示第一个字符串的前i个 和第二个字符串的前j个在可以删除若干个合法的‘()’前提下,需要多删除多少个'('才能使得第一个字符串的前i个和第二个字符串的前j个相匹配。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 # define ll long long
     4 # define inf 0x3f3f3f3f
     5 # define ll_inf (1ll<<60)
     6 const int maxn = 3e5+100;
     7 char str1[maxn],str2[maxn];
     8 int dp[100+10][100+10][100+10];
     9 int main(){
    10 // 东邪西毒
    11 scanf("%s",str1+1);
    12 scanf("%s",str2+1);
    13 dp[0][0][0]=1;
    14 int len1=strlen(str1+1),len2=strlen(str2+1);
    15 for(int i=0;i<len1;i++){
    16 for(int j=0;j<=len2;j++){
    17 for(int k=0;k<=len1;k++){
    18 if(!dp[i][j][k])continue;
    19 if(!k&&str1[i+1]==str2[j+1])dp[i+1][j+1][k]=1;
    20 if(str1[i+1]=='(')dp[i+1][j][k+1]=1;
    21 else if(k&&str1[i+1]==')')dp[i+1][j][k-1]=1;
    22 }
    23 }
    24 }
    25 if(dp[len1][len2][0])printf("Possible
    ");
    26 else printf("Impossible
    ");
    27 return 0;
    28 }

     

  • 相关阅读:
    Spring Security配置logout地址
    flex布局
    视口的学习笔记
    box-sizing属性
    css清除浮动
    line-height的理解
    position和float小结
    css居中方法小结
    margin重叠
    浅谈负margin
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10963719.html
Copyright © 2020-2023  润新知