竞赛讨论区 > 另一种思路的代码..过90.99% 求大佬DEBUG qwq
头像
一个熊猫人武僧
发布于 2019-10-20 23:55
+ 关注

另一种思路的代码..过90.99% 求大佬DEBUG qwq

dp[i][j][k]表示匹配a串的第i个字符与b串的第j个字符时,当前的a[i]选/不选时的答案

#include<bits/stdc++.h>
#define int long long
#define maxn 105 
using namespace std;
inline char get(){
    static char buf[30000],*p1=buf,*p2=buf;
    return p1==p2 && (p2=(p1=buf)+fread(buf,1,30000,stdin),p1==p2)?EOF:*p1++; 
}
inline int read(){
    register char c=get();register int f=1,_=0;
    while(c>'9' || c<'0')f=(c=='-')?-1:1,c=get();
    while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=get();
    return _*f;
}
string a,b;
int n,m;
int dp[maxn][maxn][2];//a串匹配到i,b串匹配到j时是否可行 
/*
若当前位匹配(if(a[i]==b[j]){
当前的不选=》当前的删除=》删除上一个匹配的位置 
*/
stack<int> p;
int note[maxn]; 
signed main(){
    cin>>a>>b;
    n=a.size(),m=b.size();
    a=" "+a;b=" "+b;
    for(register int i=0;i<n;i++)dp[i][0][0]=dp[i][0][1]=1;
    int ans=0;
    for(register int i=1;i<=n;i++){
        if(a[i]=='(')p.push(i);
        else{
            int cas=p.top();
            p.pop();
            note[i]=cas;
        }
    }
    for(register int i=1;i<=n;i++){
        for(register int j=1;j<=m && j<=i;j++){
            if(a[i]==b[j]){
                if(a[i]==')')dp[i][j][0]=dp[note[i]][j][0];
                else dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]);
                dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j-1][1]);
            }
            else{
                if(a[i]==')')dp[i][j][0]=dp[note[i]][j][0];
                else dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]);
                dp[i][j][1]=0;
            }
            if(j==m)ans=max(ans,max(dp[i][j][0],dp[i][j][1]));
        }
    }
    if(ans)cout<<"Possible"<<endl;
    else cout<<"Impossible"<<endl;
    return 0;
}

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐