题目:原题链接(中等)
标签:动态规划、贪心算法、数学
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | O ( 2 N ) O(2^N) O(2N) | O ( 2 N ) O(2^N) O(2N) | 超出时间限制 |
Ans 2 (Python)- | – | – | 44ms (61.68%) |
Ans 3 (Python) |
解法一(完全暴力):
class Solution:
def maxA(self, n: int) -> int:
# dp[i] = [当前总长度,剪贴板总长度]
dp = [[] for _ in range(n + 1)]
dp[0].append((0, 0))
for i in range(n):
for j, d in dp[i]:
# 按A或(Ctrl+V)
if i + 1 <= n:
dp[i + 1].append((j + max(d, 1), d))
# 按(Ctrl+A)和(Ctrl+C)
if i + 2 <= n:
dp[i + 2].append((j, j))
return max(j for j, d in dp[n])
解法二(增加剪枝条件):
class Solution:
def maxA(self, n: int) -> int:
# dp[i] = [当前总长度,剪贴板总长度]
dp = [[] for _ in range(n + 1)]
dp[0].append((0, 0))
for i in range(n):
dp[i].sort(key=lambda x: (x[1], x[0]), reverse=True)
min_j = -1
for j, d in dp[i]: # 从最大的d开始向下遍历,如果j也小于之前的j,那么j和d同时更小,一定不是更好的方案
if j <= min_j:
continue
min_j = max(j, min_j)
# 按A或(Ctrl+V)
if i + 1 <= n:
dp[i + 1].append((j + max(d, 1), d))
# 按(Ctrl+A)和(Ctrl+C)
if i + 2 <= n:
dp[i + 2].append((j, j))
return max(j for j, d in dp[n])