📜  门|门 IT 2006 |第 49 题(1)

📅  最后修改于: 2023-12-03 15:42:21.689000             🧑  作者: Mango

门|门 IT 2006 |第 49 题

题目描述

给定一个长度为N的整数数列,请你选择其中的若干数,使得这些数中任意相邻两个数字的差的绝对值恰好为1,并且选出的数字个数最多。输出可选数字的个数。

输入格式

第一行包含整数N。

第二行包含N个整数,表示完整序列。

输出格式

输出一个整数,表示可选数字的个数。

数据范围

1≤N≤1000,序列中的数的绝对值不超过10000。

样例
输入样例:
7
2 6 4 5 7 3 2
输出样例:
5
题解

这道题的解题思路是使用动态规划。其中将状态设计成f[i]表示序列前i个数,以第i个数为结尾所选数字的个数的最大值。转移方程如下:

  • 在f[i-1]的末位追加nums[i],如果合法,f[i] = f[i-1]+1(nums[i]-nums[i-1]=1)否则f[i]=f[i-1]
  • 在f[j](j<i)的末位替换为nums[i],如果合法,f[i]=f[j]+1(nums[i]-nums[j]=1)否则f[i]=f[i]

注意最后的结果是max(f[1],f[2],...,f[n]),因为最后一个数不一定是最后的max。

代码
def main():
    N = int(input())
    nums = list(map(int, input().strip().split()))
    f = [0] * N

    for i in range(N):
        f[i] = 1

        for j in range(i):
            if abs(nums[j]-nums[i]) == 1:
                f[i] = max(f[i], f[j]+1)
    print(max(f))

时间复杂度:O(N^2)