题目描述
对于一个长度为K 的整数数列:_A1,A2,…,AK,我们称之为接龙数列当且仅当 Ai的首位数字恰好等于 Ai-1 的末位数字(2 <i< K)。例如 12,23,35,56,61,11 是接龙数列;12.23,34,56 不是接龙数列,因为 56 的首位数字不等于 34 的末位数字。所有长度为1的整数数列都是接龙数列。
现在给定一个长度为 N 的数列 A1,A2…,AN,请你计算最少从中删除多少个数,可以使剩下的序列是接龙序列?
传送门
解法
# 接龙数组
# 动态规划问题
n = int(input())
lst = list(map(int, input().split()))
#dp[i]表示以i为数字最后一位的最长接龙数列
dp = [0 for i in range(10)]
for i in range(n):
if i == 0:
dp[int(str(lst[0])[-1])] = 1
else:
dp[int(str(lst[i])[-1])] = max(dp[int(str(lst[i])[0])] + 1, dp[int(str(lst[i])[-1])])
# 最少删除次数 = 数列总长度 - 最长接龙数列长度
res = n - max(dp)
print(res)
思路
最少删除次数 = 数列总长度 - 最长接龙数列长度
建立状态转移方程:dp[int(str(lst[i])[-1])] = max(dp[int(str(lst[i])[0])] + 1, dp[int(str(lst[i])[-1])])
结果
通过
查漏补缺
动态规划问题,将最少删除次数转变为求解最长接龙数列长度,即建立对立面的问题。
建立转台转移方程
更新日期
2024.02.23