zoukankan      html  css  js  c++  java
  • 删括号(dp)

    题目链接https://ac.nowcoder.com/acm/problem/21303

    思路:删括号的时候一定要时刻保证左括号数量比右括号多,我们可以定义dp[i][j][k]表示考虑AA前i个匹配了BjA被删除部分左括号数-右括号数=k是否可行,

    分类讨论转移即可,最后答案就是dp[n][m][0]

    #include <cstdio>
    #include <map>
    #include <iostream>
    #include<cstring>
    #include<bits/stdc++.h>
    #define ll long long int
    #define M 6
    using namespace std;
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
    int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
    int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
    const int inf=0x3f3f3f3f;
    const ll mod=1e9+7;
    int dp[107][107][107];
    int main(){
        ios::sync_with_stdio(false);
        string s,t;
        cin>>s>>t;
        int lens=s.length();
        int lent=t.length();
        dp[0][0][0]=1;
        for(int i=0;i<lens;i++)
            for(int j=0;j<=lent;j++)
                for(int k=0;k<=lens;k++){
                    if(dp[i][j][k]){
                        if(!k&&s[i]==t[j]) dp[i+1][j+1][k]=1;
                        if(s[i]=='(') dp[i+1][j][k+1]=1;
                        else if(k) dp[i+1][j][k-1]=1;
                    }
                }
        if(dp[lens][lent][0])
        cout<<"Possible"<<endl;
        else cout<<"Impossible"<<endl;
    }
  • 相关阅读:
    Outlook 邮件助手
    飞花令
    青蛙跳台阶
    如何提问,找到去说谎国的路
    如何计时一个小时十五分钟
    旋转数组的最小元素
    谁养鱼?
    小龙赚了多少?
    下一行是什么?
    5 = ?
  • 原文地址:https://www.cnblogs.com/wmj6/p/10854210.html
Copyright © 2011-2022 走看看