zoukankan      html  css  js  c++  java
  • 删括号(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 }

     

  • 相关阅读:
    bx值
    玲珑杯1147
    Castle
    美团 CodeM 复赛」城市网络
    上海五校赛 密码破解
    上海五校赛 零件组装
    opencv色彩空间
    opencv对图片每个像素操作
    opencv图像的读取和保存以及调用摄像头。
    numpy的logspace产生等比数列
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10963719.html
Copyright © 2011-2022 走看看