簡略題意:bob和孩子玩遊戲,孩子先手,每次他們從陣列的兩端取數。孩子每次都會取左右中最大的數,bob任取。問能否讓孩子獲勝,且兩人的分數差盡可能小。
說來慚愧,這題我不會,但是很多人過了,即使是折半列舉複雜度也還是很高,那就爆搜之後剪枝吧。
區間的極大極小值可以區間dp預處理得到。
對於某個狀態(l
,r,v
al) ,代表當前還能取[l
,r] 區間,bob和孩子的差值為val。 mx
[l][
r]代表
bob和
孩子取[
l,r]
區間的數
能得到的
最大差值
mi[l][r
]代表b
ob和孩
子取[l
,r]區
間的數能
得到的最
小差值
1.若當前處於(l
,r,v
al)狀態,va
l+mx
[l][
r]也小
於當前已
經獲得的
答案,這
部分減掉
。 2 .若當前處於(l
,r,v
al)狀態,va
l+mi
[l][
r]已經
大於0,
則無法再
更新答案
,這部分
減掉。
3 .若當前處於(l
,r,v
al)狀態,va
l+mx
[l][
r]已經大於當前的答案,且小於
0 ,則直接更新答案。
即使是這樣也還是過不去
參考這份題解snowy_smile的部落格,加上流氓性剪枝就能0m
s過了…
或者直接設定乙個遞迴次數上限,也能0m
s 過…
其實還是資料水的原因。
#include
using
namespace
std;
const
int n = 92;
int t;
int n;
int v[n];
int mx[n][n], mn[n][n];
void umax(int &x, int y)
void umin(int &x, int y)
int ans;
bool sign = 0;
int cnt = 0;
void dfs(int l, int r, int val)
if(l > r)
if(val + mx[l][r] <= ans) return ;
if(val + mn[l][r] >= 0) return ;
if(val + mx[l][r] < 0)
int tmp;
if(v[l] >= v[r]) tmp = v[l++];
else tmp = v[r--];
dfs(l, r-1, v[r] + val - tmp);
dfs(l+1, r, v[l] + val - tmp);
}int main()
}ans = -0x3f3f3f3f;
dfs(1, n, 0);
else
cout
<<-ans0;}
6 19學習筆記
一.什麼是css3?css3是css技術的公升級版本,css即層疊樣式表 cascading stylesheet 在網頁製作時採用層疊樣式 表技術,可以有效地對頁面的布局 字型 顏色 背景和其 它效果實現更加精確的控制。只要對相應的 做 些簡 單的修改,就可以改變同一頁面的不同部分,或者頁數不同 ...
d619 奇摩知識
內容 不爽寫程式的小光,轉換地方,開始為奇摩知識 奉獻,突然與腿肌同學,發現了某個人所提出來的問題,並展開激烈的討論,最後終於.不過此問題,是某個測試系統的題目.有意義的消音,多半是髒話.題目描述 大家都知道二進位制是由0和1兩種數字組成的,十進位制轉二進位制,小明現在要玩乙個遊戲,就是由1數到n,...
COGS 619 傳話 解題報告
janis 問題描述 興趣小組的同學來自各個學校,為了增加友誼,晚會上又進行了乙個傳話遊戲,如果 a 認識 b 那麼 a 收到某個訊息,就會把這個訊息傳給 b 以及所有 a 認識的人。如果 a 認識 b b 不一定認識 a 所有人從 1 到 n 編號,給出所有 認識 關係,問如果 i 發布一條新訊息...