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)
只有一行,用空格分隔的兩個整數: 依次為玩家一和玩家二最終的得分。
64 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]your program ('game1') produced all correct answers! this is your submission #2 for this problem.congratulations!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.
/*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 ...