有一把锁从左到右有n个数,组成了一个序列。只要将锁设置为输入任意单峰序列即可打开。具体为:a_1 \le \cdots \le a_i \ge a_{i+1} \ge \cdots \ge a_n\quad (1 \le i \le n)a 1 ≤⋯≤a i ≥a i+1≥⋯≥a n(1≤i≤n)。锁是拨动式的即拨一下就能换成临近的一个数(0和9可以互换求最少拨几下可以开锁。 代码
时间: 2024-03-23 14:38:01 浏览: 119
非常简单的密码锁,谢谢
以下是使用 Python 3 实现的动态规划算法:
```python
def solve(n, a):
INF = 10**9
dp = [[INF] * (n+1) for _ in range(n+1)]
for i in range(1, n+1):
dp[1][i] = i-1
for i in range(2, n+1):
for j in range(2, i+1):
for k in range(1, j):
dp[i][j] = min(dp[i][j], dp[j-1][k]+i-j+1+max(0, max(a[j:i])-a[j-1]))
return min(dp[n][j] for j in range(1, n+1))
n = int(input())
a = list(map(int, input().split()))
print(solve(n, a))
```
其中,`dp[i][j]` 表示将前 $i$ 个数变成单峰序列,其中峰值是第 $j$ 个数,需要拨动的最少次数。初始化时,将 `dp[1][i]` 赋值为 $i-1$,表示将前 $1$ 个数变成单峰序列,峰值在位置 $i$,需要拨动的最少次数。
接下来,按照上述状态转移方程,从前往后依次计算每个状态的值。最终答案为 $\min\{dp[n][j]\}$,其中 $j\in[1,n]$。
时间复杂度为 $O(n^3)$,可以通过此题。
阅读全文