有如下乙個雙人遊戲: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則長的獲勝.當然玩家可以左右手各控制乙個,可以用它來練習左手畫圓,右手畫方,以練成老玩童的左右手互搏術.遊戲寫完後,沒有找到另乙個人幫我測試,於是我就...