AC代码,但是不懂 那个if里面要加!k 是为什么

dp[i][j][k]表示a到前i个,b到前j个,还可以再删除k个右括号的情况是否有可能


#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
char a[MAXN], b[MAXN];
int dp[MAXN][MAXN][MAXN];
int main()
{
    scanf("%s%s", a + 1, b + 1);
    int lena = strlen(a + 1), lenb = strlen(b + 1);
    dp[0][0][0] = 1;
    for (int i = 1; i <= lena; i++)
    {
        for (int j = 0; j <= lenb; j++)
        {
            for (int k = 0; k <= lena; k++)
            {
                if (!k && a[i] == b[j]) dp[i][j][k] |= dp[i - 1][j - 1][k];
                if (a[i] == '(' && k > 0) dp[i][j][k] |= dp[i - 1][j][k - 1];
                if (a[i] == ')') dp[i][j][k] |= dp[i - 1][j][k + 1];
            }
        }
    }
    if (dp[lena][lenb][0]) printf("Possible");
    else printf("Impossible");
    return 0;
}
/*
((())((())())())
(()(())())
*/


全部评论
因为删除时'('和')必须连续,所以当k>0时必须要删除,不然肯定不成立
3 回复 分享
发布于 2019-07-04 20:57
(()(())) ()()
2 回复 分享
发布于 2019-04-17 22:28
dp[i][j][k]表示a到前i个,b到前j个,还可以再删除k个左括号的情况,理解这个数组表示的意思,k可以理解为序列1比序列2多几个左括号,如果没有判断 !k,相当于当序列1和序列2某个字符相等时,不管删去多少个左括号都成立,这就是错误所在。 
2 回复 分享
发布于 2019-07-17 16:15
逻辑非。 就是如果k为0,这个值就为1。如果k不为0,这个值就为0。
点赞 回复 分享
发布于 2019-04-15 23:24

相关推荐

不愿透露姓名的神秘牛友
09-05 13:35
点赞 评论 收藏
分享
鼠鼠能上岸吗:进行中是秋招大项目进行中,你还可以选别的岗位;已结束是这个岗位流程结束了;筛选中就是在简历筛选环节没hr捞
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务