动态规划:数组切分

文章介绍了一种利用动态规划解决寻找能恰好分成若干连续数部分的子序列问题的方法。通过定义状态dp(i)表示以第i个数字结尾的子序列方案数,利用状态转移方程进行计算。虽然Python实现会因语言效率导致超时,但阐述了算法思想和时间复杂度分析。
摘要由CSDN通过智能技术生成

解题思路

一个能够恰好分成若干部分,并且每个部分恰好为连续数
子序列特征最大值减最小值等于左端点减右端点
O ( n 2 ) O(n^2) O(n2)
暴力搜索:枚举每一个左端点和每一个右端点
动态规划:定义状态 d p ( i ) dp(i) dp(i)表示最后一个部分以第i个数字结尾的方案数。

状态转移
1、考虑以第 i i i个数字为最后一个部分的右端点端点,
2、枚举最后一个部分的左端点 j j j,当满足左端点 j j j到右端点 i i i之间的区间是连续数,我们则认为是合法的。于是dp(i)可以通过 d p ( j − 1 ) dp(j-1) dp(j1)转移过来,最后一部分表示的区间为 [ j , i ] [j , i] [j,i]

转移方程式如下

d p ( i ) = ∑ j = 1 i d p ( j − 1 ) [ j − i = = m a x ( a k ) − m i n ( a k ) ] , k ∈ ( i , j ) , j ∈ ( 1 , i ) dp(i) = \sum_{j=1}^i dp(j - 1)[j - i == max(a_k) - min(a_k) ], \\ k \in (i,j), j \in (1,i) dp(i)=j=1idp(j1)[ji==max(ak)min(ak)],k(i,j),j(1,i)

时间复杂度为 O ( n 2 ) O(n^2) O(n2)

Code(Python3)(TLE)

由于 python 语言本身执行效率较低,故采用上述解法的 python 代码提交的结果是超时。经过时间测试,该代码完成最大测试用例的时间在 22s 左右。

# -*- coding: utf-8 -*-
# @Author : BYW-yuwei
# @Software: python3.8.6
MOD=int(1e9+7)
n=int(input())
w=[0]
dp=[0]*(n+1)
w.extend([int(i) for i in input().split()])
dp[0]=1
maxn,minn=0,int(1e9)
for i in range(1,n+1):
    maxn,minn=0,int(1e9)
    for j in range(i,0,-1):
        maxn=max(maxn,w[j])
        minn=min(minn,w[j])
        if maxn-minn==i-j:
            dp[i]=(dp[i]+dp[j-1])%MOD
print(dp[n])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是雨玮a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值