您的位置:首页 > 游戏 > 手游 > leetcode:布尔运算(动态规划版)

leetcode:布尔运算(动态规划版)

2024/12/21 19:48:59 来源:https://blog.csdn.net/W_extend/article/details/142280791  浏览:    关键词:leetcode:布尔运算(动态规划版)

最近又要考试,勉励自己复习一些之前学过的!!!

开始使用的是DFS,遍历所有可能的情况,发现超时!

下面的是动态规划的一个模板,dp[i][j][result]表示从s的第i个元素到第个元素,结果为result的方案数。主要是第一层for循环从i到j的长度,长度从小到大,dp可以通过长度小的方案数,推出长度大的方案数。

假如:x|y|z|v

如果知道dp[0][2]和dp[3][5],那么dp[0][5]也可以推出来。有点分治的思想。把长的分成短的。

class Solution:def countEval(self, s: str, result: int) -> int:n = len(s)if not n: return 0dp = [ [ [0,0] for _ in range(n)] for _ in range(n) ]for i in range(0, n, 2):dp[i][i][0] = int(s[i])^1dp[i][i][1] = int(s[i])print(dp[i][i])for L in range(2, n, 2):for i in range(0, n, 2):j = i + Lif j >= n:breakfor k in range(i+1, j, 2):if s[k] == "&":dp[i][j][0] += dp[i][k-1][0]*dp[k+1][j][0] + dp[i][k-1][0]*dp[k+1][j][1] + dp[i][k-1][1]*dp[k+1][j][0]dp[i][j][1] += dp[i][k-1][1]*dp[k+1][j][1]elif s[k] == "|":dp[i][j][0] += dp[i][k-1][0]*dp[k+1][j][0]dp[i][j][1] += dp[i][k-1][1]*dp[k+1][j][1] + dp[i][k-1][0]*dp[k+1][j][1] + dp[i][k-1][1]*dp[k+1][j][0]else:dp[i][j][0] += dp[i][k-1][0]*dp[k+1][j][0] + dp[i][k-1][1]*dp[k+1][j][1]dp[i][j][1] += dp[i][k-1][1]*dp[k+1][j][0] + dp[i][k-1][0]*dp[k+1][j][1]return dp[0][-1][result]

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com