蓝桥杯合并石子

文章介绍了如何使用动态规划解决列表合并问题,但存在运行超时的情况。作者寻求方法优化算法以完成所有测试用例,关注缩短时间复杂度的方法。
摘要由CSDN通过智能技术生成
n = int(input())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
s = [0]
cost = [ [0]*(n+1) for _ in range(n+1)]
nums = [ [0]*(n+1) for _ in range(n+1)]
print('a',a)
print('b',b)
s0 = 0
# sum记录累计和
#  dp 初始化
MAX = 10**9
dp = [ [ [MAX]*(3) for _ in range(n+1)]  for _ in range(n+1)]
print('dp',dp)
for i in range(1,n+1):
    s0 = s0+a[i-1]
    s.append(s0)
    dp[i][i][b[i-1]] = 0 # 代表单独成一堆 所以花费为0
    for j in range(i,n+1):
        nums[i][j] = j-i+1


for len in range(2,n+1):
    for i in range(1,n+1-len+1):
        j = i+len-1
        for c in range(3):
            m = MAX
            for k in range(i,j):
                if dp[i][k][c]!=MAX and dp[k+1][j][c]!=MAX:
                

                    m = min(m,dp[i][k][c]+dp[k+1][j][c] +s[j]-s[i-1])
            if m==MAX:
                continue
            dp[i][j][(c+1)%3]=min(dp[i][j][(c+1)%3],m)
            nums[i][j] = 1
            cost[i][j] = min(dp[i][j][0],min(dp[i][j][1],dp[i][j][2]))


for k in range(1,n+1):
    for i in range(1,k+1):
        for j in range(k+1,n+1):
            if nums[i][j]>nums[i][k]+nums[k+1][j]:
                nums[i][j] = nums[i][k] + nums[k+1][j]
                cost[i][j] = cost[i][k] + cost[k+1][j]
            else:
                if nums[i][j]==nums[i][k]+nums[k+1][j]:
                    cost[i][j] = min(cost[i][j],cost[i][k]+cost[k+1][j])
print(dp)
print(nums)
print(cost)
print(str(nums[1][n])+' '+str(cost[1][n]))


                                     
            

运行超时怎么办,只能完成一半的测试用例,还可以怎么缩减时间呢?

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值