USACO A Game (經典區間DP)

2022-06-01 20:30:12 字數 2406 閱讀 6877

a game遊戲

ioi'96 - day 1

有如下乙個雙人遊戲:n(2 <= n <= 100)個正整數的序列放在乙個遊戲平台上,遊戲由玩家1開始,兩人輪流從序列的兩端取數,取數後該數字被去掉並累加到本玩家的得分中,當數取盡時,遊戲結束。以最終得分多者為勝

編乙個執行最優策略的程式,最優策略就是使玩家在與最好的對手對弈時,能得到的在當前情況下最大的可能的總分的策略。你的程式要始終為第二位玩家執行最優策略。

program name: game1

input format:

(file game1.in)

第一行: 正整數n, 表示序列中正整數的個數。

第二行至末尾: 用空格分隔的n個正整數(大小為1-200)。

output format:

(file game1.out)

只有一行,用空格分隔的兩個整數: 依次為玩家一和玩家二最終的得分。

6 

4 7 2 9 5 2

18 11

分析:

簡單又比較經典的區間dp,每個狀態無非就是這個人從左邊拿還是從右邊拿嘛,然後我們看怎麼表達出狀態轉移方程。

子問題:假設當前狀態a1,a2,a3,a4,a5,如果第乙個人選最左邊的,則問題轉化為四個數a2,a3,a4,a5,然後第二個人先選,由於題目說第二個人方案也最優,所以選的也是最優方案;先選右邊同理。

轉移方程:設f[i][j]表示選[i,j]區間的數,先選的那個人的最優方案。則:

f[i][j]=max

因為選了乙個後轉化成的子問題,第二個人是先選,所以第乙個人只能拿到子問題的後選的人的解,即sum[i][j]-f[i][j]。

user: zhipeng zhang [138_3531]

task: game1

lang: c++

compiling...

compile: ok

executing...

test 1: test ok [0.000 secs, 3212 kb]

test 2: test ok [0.000 secs, 3212 kb]

test 3: test ok [0.000 secs, 3212 kb]

test 4: test ok [0.000 secs, 3212 kb]

test 5: test ok [0.000 secs, 3212 kb]

test 6: test ok [0.000 secs, 3212 kb]

test 7: test ok [0.000 secs, 3212 kb]

test 8: test ok [0.000 secs, 3212 kb]

test 9: test ok [0.000 secs, 3212 kb]

test 10: test ok [0.000 secs, 3212 kb]

test 11: test ok [0.000 secs, 3212 kb]

test 12: test ok [0.000 secs, 3212 kb]

test 13: test ok [0.000 secs, 3212 kb]

test 14: test ok [0.000 secs, 3212 kb]

test 15: test ok [0.000 secs, 3212 kb]

test 16: test ok [0.000 secs, 3212 kb]

all tests ok.

your program ('game1') produced all correct answers! this is your submission #2 for this problem.congratulations!

/*

id:138_3531

lang:c++

task:game1

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int max(int x,int

y)int

main()

區間dp(經典問題)

所謂區間dp,顧名思義就是在一段區間上的動態規劃。它既要滿足dp問題的最優子結構和無後效性外,還應該符合在區間上操作的特點。我的理解是往往會對區間進行合併操作。抑或是單個元素 可看成乙個小區間 跨區間進行操作。例如括號匹配問題,石子合併問題 通過多次的相鄰合併,最後實質上會產生跨區間的合併,如果你把...

經典 區間dp 合併石子

題目鏈結 這個動態規劃的思是,要得出合併n堆石子的最優答案可以從小到大列舉所有石子合併的最優情況,例如要合併5堆石子就可以從,最優的2 3和1 4中得到最佳的答案。從兩堆最優到三堆最優一直到n堆最優。狀態轉移方程式 dp i j min dp i k dp k 1 j 複雜度為o n 3 inclu...

區間DP經典 石子合併

題目鏈結 題意 環形的一群石子,每次可以選擇相鄰的兩堆合併,分數為新得到的一堆石子,求將這片石子合併成一堆的最大和最小分數 輸入 第一行乙個正整數n,其後n個數代表每堆石子的個數 分析 第一次寫的時候我想當然的寫的狀態轉移方程是dpx l r max dpx l 1 r a l r dpx l r ...