kqp发明了一个好玩的游戏,叫ljj一起玩。但ljj玩了十几盘,总是输,他想知道是不是从一开始他就注定要输。这个游戏是这样的,kqp先写下一排数,然后盖住。在选数时,kqp和ljj每次只能看到头与尾的数字并只能取其中一个数,同时还规定如果头和尾的数字一样,就选尾的。最后谁取的数的和多,谁就赢了。如果两人的和一样多,先取者胜。有天FW看到他们俩在玩这个游戏,很好奇。他想知道,在两人总是做出最优决策的情况下,谁能取得最终的胜利呢? 输入格式 第一行为一个数 k(k ≤ 10),表示有 k 组测试数据: 以下 k 组测试数据: 每组测试数据中,第一行仅有一个偶数 n(0 < n ≤ 100000),第二行也仅有一个数,0 表示kqp先取数,1 表示ljj先取数,第三行有 n 个数,是kqp给出的一排数。这 n 个数的绝对值均不超过106 。 输出格式 对每组测试数据输出一行表示在两人总是做出最优决策的情况下, 最终的胜利者的名字,即“kqp”或“ljj”(引号不输出)。
时间: 2024-04-16 22:26:15 浏览: 20
根据题目的描述,我们可以使用动态规划来决这个问题。对于每一组测试数据,我们需要计算在两人总是做出最优决策的情况下,最终的胜利者。
具体的思路如下:
1. 定义一个二维数组dp,dp[i][j]表示从第i个数到第j个数之间的子序列中,当前玩家与对手之间的最大得分差值。其中i <= j。
2. 初始化dp数组。对于dp[i][i],即只有一个数的情况,当前玩家先取数,所以dp[i][i] = nums[i]。对于dp[i][i+1],即只有两个数的情况,当前玩家先取数,所以dp[i][i+1] = max(nums[i], nums[i+1])。
3. 使用动态规划的思想,从长度为3的子序列开始逐步计算dp数组。对于长度为len的子序列,假设当前玩家先取数,则有两种情况:
a. 当前玩家取了第i个数,则对手可以选择取第i+1个数或者第j个数。如果对手取第i+1个数,则当前玩家得分为nums[i] - dp[i+2][j];如果对手取第j个数,则当前玩家得分为nums[i] - dp[i+1][j-1]。所以当前玩家的得分为max(nums[i] - dp[i+2][j], nums[i] - dp[i+1][j-1])。
b. 当前玩家取了第j个数,则对手可以选择取第i个数或者第j-1个数。如果对手取第i个数,则当前玩家得分为nums[j] - dp[i+1][j-1];如果对手取第j-1个数,则当前玩家得分为nums[j] - dp[i][j-2]。所以当前玩家的得分为max(nums[j] - dp[i+1][j-1], nums[j] - dp[i][j-2])。
当前玩家的最大得分为上述两种情况中的较大值。
4. 根据dp[0][n-1]的值判断最终胜利者。如果dp[0][n-1] >= 0,则表示当前玩家的得分大于等于对手的得分,当前玩家胜利;否则,对手胜利。
下面是使用Python实现的代码示例:
```python
k = int(input())
for _ in range(k):
n = int(input())
turn = int(input())
nums = list(map(int, input().split()))
dp = [[0] * n for _ in range(n)]
for i in range(n):
dp[i][i] = nums[i]
for i in range(n-2, -1, -1):
for j in range(i+1, n):
choose_i = max(nums[i] - dp[i+2][j], nums[i] - dp[i+1][j-1])
choose_j = max(nums[j] - dp[i+1][j-1], nums[j] - dp[i][j-2])
dp[i][j] = max(choose_i, choose_j)
if dp[0][n-1] >= 0:
print("kqp")
else:
print("ljj")
```
希望以上解答能够帮助到你!如有任何疑问,请随时提问。