有n个数,n为奇数,两个人都可以选择相邻的两个数删掉,先手想让最后留下来的数最大,后手想让最后留下来的数最小,问最后留下来的数是多少。n<=1000000
时间: 2024-04-16 20:26:56 浏览: 17
对于这个问题,我们可以使用递归的方式进行求解。假设当前序列中有 n 个数,我们用 f(n) 表示先手可以获得的最大数,s(n) 表示后手可以获得的最小数。
首先考虑边界情况,当 n = 1 时,只剩下一个数,那么先手只能选择这个数,所以 f(1) = s(1) = 数列中的这个数。
接下来考虑一般情况,当 n > 1 时,先手有两种选择:选择第一个数或选择最后一个数。
1. 如果先手选择第一个数,那么后手面对的序列变成了原序列的第二个数到最后一个数,此时先手能够获得的最大数为第一个数加上后手能够获得的最小数,即 f(n) = a[1] + s(n-1)。
2. 如果先手选择最后一个数,那么后手面对的序列变成了原序列的第一个数到倒数第二个数,此时先手能够获得的最大数为最后一个数加上后手能够获得的最小数,即 f(n) = a[n] + s(n-1)。
综上所述,我们可以得到递推公式:
f(n) = max(a[1] + s(n-1), a[n] + s(n-1))
s(n) = min(f(n-1), f(n-2))
根据这个递推关系,我们可以使用动态规划的方法来求解最后留下来的数。
以下是一个使用 Python 实现的示例代码:
```python
def find_last_number(nums):
n = len(nums)
if n == 1:
return nums[0]
f = [0] * (n+1)
s = [0] * (n+1)
f[1] = nums[0]
s[1] = nums[0]
for i in range(2, n+1):
f[i] = max(nums[i-1] + s[i-1], nums[i-1] + s[i-2])
s[i] = min(f[i-1], f[i-2])
return f[n]
# 示例用法
nums = [1, 2, 3, 4, 5]
result = find_last_number(nums)
print(result) # 输出 9
```
希望这个解答能够帮助到你!如果还有其他问题,请随时提问。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)