HDU 6196 卡時搜尋

2021-08-08 03:54:53 字數 1734 閱讀 2647

簡略題意: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 發布一條新訊息...