描述 description
中國古代的歷史故事「田忌賽馬」是為大家所熟知的。話說齊王和田忌又要賽馬了,他們各派出n匹馬,每場比賽,輸的一方將要給贏的一方200兩**,如果是平局的話,雙方都不必拿出錢。現在每匹馬的速度值是固定而且已知的,而齊王出馬也不管田忌的出馬順序。請問田忌該如何安排自己的馬去對抗齊王的馬,才能贏取最多的錢?
輸入格式 inputformat
第一行為乙個正整數n (n <= 1000) ,表示雙方馬的數量。
第二行有n個整數表示田忌的馬的速度。
第三行的n個整數為齊王的馬的速度。
輸出格式 outputformat
僅有一行,為田忌賽馬可能贏得的最多的錢,結果有可能為負。
樣例輸入 sampleinput [複製資料]
392 83 71
95 87 74
樣例輸出 sampleoutput [複製資料]
200
這道題目,首先容易想到的就是貪心,當然,我一開始貪心,爆0!
正確的演算法是 貪心+動規。
首先當然容易想到貪心,首先對他們的馬的速度進行排序(由於資料只有1000,氣泡排序也可以)。
貪心1:如果田忌的當前最大速度的馬大於齊王的最大速度的馬,那麼就和它比,贏得200。
貪心2:如果田忌的當前最大速度的馬小於齊王的最大速度的馬,那麼就用田忌速度最小的馬和他比,輸200。
貪心3:如果田忌的當前最大速度的馬小於齊王的最大速度的馬,那麼可以有兩種:一是和他平局,另外是保留它,用最小的和齊王的馬比。
問題出於貪心3:我們若選擇前者 ,假如有 4 3 1 和 4 3 2,如果平局,我們會輸200,如果保留,我們會贏200。
但是,反例就來了: 3 2和 3 1,如果平局,我們能拿200,如果保留,我們只能拿0;
怎麼辦?
我們發現,我們對田忌的馬進行排序以後,後面對他的操作都是對頭或對尾進行,而不會動中間。
設i為當前進行第i場比賽,j為對田忌的馬的頭部進行操作的個數,a為田忌的馬的速度,b為齊王的馬的速度,ha為兩速度進行比較所贏得錢的數量。我們就可以設計出方程:
f[i,j]:=max(f[i-1,j]+ha(a[n-(i-j)+1],b[i]),f[i-1,j-1]+ha(a[j],b[i])])。
則ans:=max(f[i,k]) (0<=k<=n);
1program p1048; uses
math;
2var
3i,j,k,l,m,n,t,w,ans:longint;
4 st,sq:array[0..2100]of
longint;
5 f:array[-1..2100,-1..2100]of
longint;
6function
haha(a,b:longint):longint;
7begin
8if a>b then haha:=(200)9
else
if a=b then haha:=(0)10
else
if athen haha:=(-200
);11
end;
12begin
13 assign(input,'
p1048.in');
14reset(input);
15read
(n);
16for i:=1
to n do
read
(st[i]);
17for i:=1
to n do
read
(sq[i]);
18for i:=1
to n do
19for j:=1
to i-1
do20
begin
21if st[i]>st[j] then
22begin
23 t:=st[i]; st[i]:=st[j]; st[j]:=t;
24end;25
end;
26for i:=1
to n do
27for j:=1
to i-1
do28
begin
29if sq[i]>sq[j] then
30begin
31 t:=sq[i]; sq[i]:=sq[j]; sq[j]:=t;
32end;33
end;
3447 fillchar(f,sizeof(f),0
);48
for i:=1
to n do
49for j:=0
to i do
50begin
51if j=0
then
52 f[i,j]:=f[i-1,j]+haha(st[n-(i-j)+1
],sq[i])
53else
54 f[i,j]:=max(f[i-1,j]+haha(st[n-(i-j)+1],sq[i]),f[i-1,j-1]+haha(st[j],sq[i]));
55end;56
for i:=0
to n do
57begin
58if f[n,i]>ans then ans:=f[n,i];
59end;60
write
(ans);
61end.
TYVJ P1048 田忌賽馬 Label dp
中國古代的歷史故事 田忌賽馬 是為大家所熟知的。話說齊王和田忌又要賽馬了,他們各派出n匹馬,每場比賽,輸的一方將要給贏的一方200兩 如果是平局的話,雙方都不必拿出錢。現在每匹馬的速度值是固定而且已知的,而齊王出馬也不管田忌的出馬順序。請問田忌該如何安排自己的馬去對抗齊王的馬,才能贏取最多的錢?第一...
TYVJ 1048 田忌賽馬 貪心解法
中國古代的歷史故事 田忌賽馬 是為大家所熟知的。話說齊王和田忌又要賽馬了,他們各派出n匹馬,每場比賽,輸的一方將要給贏的一方200兩 如果是平局的話,雙方都不必拿出錢。現在每匹馬的速度值是固定而且已知的,而齊王出馬也不管田忌的出馬順序。請問田忌該如何安排自己的馬去對抗齊王的馬,才能贏取最多的錢?第一...
nyoj 田忌賽馬
題目大意 第一行給出n表示有n場比賽,以下兩行分別給出n個數,分別表示田忌和齊王n匹馬的速度,贏家從輸者手中獲得200錢,求田忌最多能贏多少錢。思路 1.先把兩者的馬按速度從大到小排序 2.從最大的馬開始比較,若出現齊王的馬比田忌的馬快,先暫停。3.將此時齊王最快的馬和田忌最慢的馬比賽,田忌輸掉一局...