雙人遊戲問題

2021-09-03 07:42:25 字數 1346 閱讀 2691

有如下乙個雙人遊戲:n個正整數的序列放在乙個遊戲平台上,兩個人輪流從序列的兩端取數,取數後該數字被去掉並累加到本玩家的得分中,當數取盡時,遊戲結束,以最終的分多者為勝利。編寫乙個執行最優策略的程式,最優策略就是使得自己能在當前情況下得到最優策略。要求程式要始終為第二位玩家執行最優策略。

該題目的動態規劃方程是:

設sum(s,t)為區間s,t中的數字和,gain(s,t)為按照最優策略能獲得的最大得分,那麼有兩種數字的方式:

1,取s,則給對手留下餘下的區間是(s+1,t),對手的收益是gain(s+1,t)

2,或者取t,則給對手留下的區間是(s,t-1),對手的收益是gain(s,t-1)

無論如何,自身得分是sum(s,t)-min

def memorize_gain(arr,i,j):

if i==j:

memorize[i][j]=arr[i]

return arr[i]

if memorize[i+1][j]>0:

p=memorize[i+1][j]

else:

p=memorize_gain(arr,i+1,j)

if memorize[i][j-1]>0:

q=memorize[i][j-1]

else:

q=memorize_gain(arr,i,j-1)

memorize[i][j]=sum[i][j]-min(p,q)

print(i,j,p, q,memorize[i][j])

return memorize[i][j]

if __name__ == "__main__":

n = int(input())

# arr=input()

# arr=[int(n) for n in arr.split()]

arr = [0 for i in range(n + 1)]

for i in range(1, n + 1):

arr[i] = int(input())

sum = [[0 for i in range(n + 1)] for i in range(n + 1)]

memorize = [[0 for i in range(n + 1)] for i in range(n + 1)]

for i in range(1, n + 1): # 自底向上

for j in range(i, n + 1):

sum[i][j] = sum[i][j - 1] + arr[j]

print(memorize_gain(arr, 1, n), ' ', sum[1][n] - memorize[1][n])

藍橋杯 雙人遊戲

思路 而且要注意,兩條路線在走重複的格仔之後,必須各走各的,不要又走成交叉 重複的了。所以對於這個重複的格仔來說,它只會有2種情況,如 include include include using namespace std define mem a memset a 0,sizeof a const...

Bob 雙人接小球遊戲

import pygame import random yihaowanjiadefen 0erhaowanjiadefen 0import time as t defball screen,x,y,down,right,green,speed if down y y speed else y y ...

遊戲 雙人貪吃蛇

兩個人玩的貪吃蛇遊戲,很早之前就有將貪吃蛇改成雙人遊戲的想法,今天終於抽出時間完成了.鍵盤上下左右和wsad分別控制兩條蛇,兩隻蛇的長度如果相差大於5則長的獲勝.當然玩家可以左右手各控制乙個,可以用它來練習左手畫圓,右手畫方,以練成老玩童的左右手互搏術.遊戲寫完後,沒有找到另乙個人幫我測試,於是我就...