tyvj p1048 田忌賽馬 (0 100分)

2022-06-02 20:33:07 字數 2866 閱讀 7442

描述 description

中國古代的歷史故事「田忌賽馬」是為大家所熟知的。話說齊王和田忌又要賽馬了,他們各派出n匹馬,每場比賽,輸的一方將要給贏的一方200兩**,如果是平局的話,雙方都不必拿出錢。現在每匹馬的速度值是固定而且已知的,而齊王出馬也不管田忌的出馬順序。請問田忌該如何安排自己的馬去對抗齊王的馬,才能贏取最多的錢?

輸入格式 inputformat

第一行為乙個正整數n (n <= 1000) ,表示雙方馬的數量。

第二行有n個整數表示田忌的馬的速度。

第三行的n個整數為齊王的馬的速度。

輸出格式 outputformat

僅有一行,為田忌賽馬可能贏得的最多的錢,結果有可能為負。

樣例輸入 sampleinput [複製資料]

3

92 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);

1

program 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.將此時齊王最快的馬和田忌最慢的馬比賽,田忌輸掉一局...