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.每次取數都有...