取數遊戲 紀中 1308 蜜汁dp

2021-07-14 22:00:12 字數 1849 閱讀 4191

alice想讓bob陪他去看《唐山大**》,但由於bob是個很感性的人,怕流淚不想去,但又不好意思以這個作為拒絕的理由,便提出玩乙個遊戲。

n個正整數圍成一圈,規則如下:

•兩個玩家輪流取數;

•最開始先手的玩家可以取任意乙個數x;

•從第二步開始當前玩家只能取x(上一玩家剛剛取的數)左右兩邊相鄰的數;

•直到取完所有的數,遊戲結束;

•取得較多奇數的玩家獲勝。

bob為了顯示大度,讓alice先取,但他忘了自己和alice都是絕頂聰明之人,現在alice請你幫他計算第一步有多少種取法使得最終獲得勝利。

第一行包含乙個整數n(1<=n<=100),表示數的個數。第二行包含n個正整數,每個數都在1到1000之間,任意兩個數互不相同。

輸出alice第一步有多少種取法。

這個東西有一些玄。

首先我們設乙個s[i,j]表示i—j區間中奇數的個數。 f[

i,j]

=max

(s[i

,j]−

f[i+

1,j]

,s[i

,j]−

f[i,

j−1]

) 可以列舉alice的第一次選擇。

自行畫圖理解。

va-r 

a:array[0..200] of longint;

s:array[0..200] of longint;

f:array[0..200,0..200] of longint;

i,j,k,l:longint;

ans:longint;

n:longint;

function

max(x,y:longint):longint;

begin

if x>y then max:=x

else max:=y;

end;

begin

readln(n);

for i:=1

to n do

read(a[i]);

for i:=1

to n do

begin

k:=0;

fillchar(f,sizeof(f),0);

fillchar(s,sizeof(s),0);

for j:=1

to n do

begin

k:=k+1;

if a[j] mod

2=1then

begin

//k:=k+1;

f[k,k]:=1;

end;

end;

for j:=1

to n do

begin

s[j]:=s[j-1];

if a[j] mod

2=1then s[j]:=s[j]+1;

end;

for k:=1

to n-2

dofor j:=1

to n-k do

begin

l:=k+j;

f[j,l]:=max(s[l]-s[j-1]-f[j+1,l],s[l]-s[j-1]-f[j,l-1]);

l:=l;

end;

f[1,n]:=s[l]-f[2,n];

if s[n] div

2+1<=f[1,n] then ans:=ans+1;

k:=a[1];

for j:=1

to n do

a[j]:=a[j+1];

a[n]:=k;

end;

write(ans);

end.

1308 取數遊戲

description alice想讓bob陪他去看 唐山大 但由於bob是個很感性的人,怕流淚不想去,但又不好意思以這個作為拒絕的理由,便提出玩乙個遊戲。n個正整數圍成一圈,規則如下 兩個玩家輪流取數 最開始先手的玩家可以取任意乙個數x 從第二步開始當前玩家只能取x 上一玩家剛剛取的數 左右兩邊相...

JZ高中OJ 1308 取數遊戲

time limits 1000 ms memory limits 65536 kb detailed limits description alice想讓bob陪他去看 唐山大 但由於bob是個很感性的人,怕流淚不想去,但又不好意思以這個作為拒絕的理由,便提出玩乙個遊戲。n個正整數圍成一圈,規則如...

區間DP 矩陣取數遊戲

試題 noip2007 提高組 問題描述 帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的 n m的矩陣,矩陣中的每個元素 aij均為非負整數。遊戲規則如下 1.每次取數時須從每行各取走乙個元素,共 n個。m次後取完矩陣所有元素 2.每次取走的各個元素只能是該元素所在行的行首或行尾 3.每次取數都有...