經典博弈區間dp
題意:給定n個數字,a和b可以從這串數字的兩端任意選數字,一次只能從一端選取。
並且a b都盡力使自己選擇的結果為最大的,可以理解成a b每一步走的都是最優的。
如果a先選擇,則a b差值最大是多少。
分析:總和是一定的,所以乙個得分越高,另乙個人的得分越低。當前狀態總是最開始的狀態的乙個子狀態。
d(i,j): 先手取 i ~ j 最優策略下,得分最大值。
d(i,j) = sum(i,j) - min(d(i+1,j),d(i+2,j),...,d(j,j), d(i,j-1),d(i,j-2),...,d(i,i),0)
0表示全部取完;
答案就是 d(1,n) - ( sum(1,n) - d(1,n) );
tip: sum(i,j) 可以在 o(1) 的時間內求出來。 s[i] 是 1~ i 的和,那麼 sum(i,j) = s[j] - s[i-1];
#include usingnamespace
std;
intn;
const
int maxn = 100 + 10
;int
s[maxn],a[maxn],d[maxn][maxn],vis[maxn][maxn];
int dp(int i,int
j) int
main()
memset(vis,
0,sizeof
(vis));
printf(
"%d\n
",2*dp(1,n)-s[n]);
}return0;
}
Sum遊戲 Uva10891 區間dp
給定乙個序列,a,b玩家輪流取數,每次只能從一段取若干個數,乙個人取數的和代表該人的得分,若a,b都採取最優策略,問a的得分 b的得分 對於都是正數的情況,肯定一次取完就可以。但是由於有負數,所以我們就要考慮列舉取法 已知取完後的序列一定是原序列的乙個子串行,因此,我們列舉取法 dp i j 表示剩...
UVA 10881 經典模擬題
題目大意 一根長l厘公尺的木棍上有n只螞蟻,每只螞蟻有個開始的位置和爬行方向,速度為1.當兩隻螞蟻相撞後,兩者同時掉頭繼續爬行,求按輸入順序給出每只螞蟻t秒後的位置後朝向。解題思路 1.每只螞蟻相撞後同時掉頭可以看做對穿而過,關鍵的問題就在於求位置的變化。2.按位置從小到大排序,可以驚奇的發現排序後...
UVA 571 Jugs(經典倒水問題)
題意 在電影 虎膽龍威3 中,布魯斯和傑克遜要面對這樣乙個問題,他們有乙個3加侖的杯子和乙個5加侖的杯子,他們被問這麼把5加侖的杯子裡面填滿4加侖的水。這個問題可以被描述為這樣乙個謎題。你擁有兩個杯子a和b,以及無盡的水。你可以執行以下3種操作 1.填滿1個杯子的水 2.倒空1個杯子的水 3.將1個...