您的位置:首页 > 其它

【贪心DP】田忌赛马

2011-11-06 17:27 225 查看
田忌赛马
描述 Description
  中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?
输入格式 Input Format
第一行为一个正整数n (n <= 1000) ,表示双方马的数量。

第二行有N个整数表示田忌的马的速度。

第三行的N个整数为齐王的马的速度。
输出格式 Output Format
仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。
样例输入 Sample Input [复制数据]
3
92 83 71
95 87 74
样例输出 Sample Output [复制数据]
200
时间限制 Time Limitation
各个测试点1s
=================

=================

type
arr=array[1..1000]of longint;
var
n:longint;
a:array[1..1000]of longint;
b:array[1..1000]of longint;
f:array[0..1100,0..1100]of longint;
procedure init;
begin
assign(input,'p1048.in');
assign(output,'p1048.out');
reset(input); rewrite(output);
end;

procedure terminate;
begin
close(input); close(output);
halt;
end;

procedure qsort(var a:arr;s,t:longint);
var
i,j:longint;
x,tem:longint;
begin
x:=a[(s+t)shr 1];
i:=s; j:=t;
repeat
while x>a[j] do dec(j);
while x<a[i] do inc(i);
if i<=j then
begin
tem:=a[i]; a[i]:=a[j]; a[j]:=tem;
inc(i); dec(j);
end;
until i>j;
if i<t then qsort(a,i,t);
if s<j then qsort(a,s,j);
end;

function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;

procedure main;
var
i,j:longint;
ans:longint;
begin
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do read(b[i]);
qsort(a,1,n);
qsort(b,1,n);
for i:=0 to 1100 do
for j:=0 to 1100 do
f[i,j]:=-100000000;
f[1,1]:=0;
for i:=1 to n do
for j:=1 to n do
if f[i,j]<>-100000000 then
begin
if a[i]>b[j] then f[i+1,j+1]:=max(f[i+1,j+1],f[i,j]+200);
if a[i]=b[j] then
begin
f[i+1,j+1]:=max(f[i+1,j+1],f[i,j]);
f[i,j+1]:=max(f[i,j+1],f[i,j]-200);
end;
if a[i]<b[j] then f[i,j+1]:=max(f[i,j+1],f[i,j]-200);
end;
ans:=-maxlongint;
for i:=1 to n+1 do
begin
if ans<f[i,n+1] then ans:=f[i,n+1];
if ans<f[n+1,i] then ans:=f[n+1,i];
end;
writeln(ans);
end;

begin
init;
main;
terminate;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: