USACO 3.2 A game

这题DP    方程如下 (参考了 DRS 上的帖子.......)

 



 设 F1[I,J] 为第一个人(先行者) 从I  取到 J 的最大分数
F2[I,J] 同样.....
  S[I] 为 第 I 张牌的分数..... Sum[I] 为第 1 到第 I 张牌的分数总和....

 F1[I,J]=max{ F2[I+1,J]+S[I] , F2[I,J-1]+S[J] }
  F2[I,J]=Sum[J]-Sum[I-1]-F1[I,J]
 
 


 写完这个程序.....狂兴奋.....嘿嘿........  
    庆祝................  加油......继续努力.......

 程序如下

{
ID:helen_l3
PROB:game1
LANG:PASCAL
}

program game1;
const maxn=100;
     inf='game1.in';
     ouf='game1.out';
var f1,f2:array [1..maxn,1..maxn] of longint;
   sum,s:array [0..maxn] of longint;
   n:longint;

procedure init;
var i:longint;
begin
 assign(input,inf);reset(Input);
 readln(n);
 fillchar(sum,sizeof(sum),0);
 for i:=1 to n do begin
   read(s); sum:=sum[i-1]+s;
 end;
 close(input);
end;

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

procedure main;
var i,j,k:longint;
begin
 for k:=1 to n-1 do
   for i:=1 to n-k do begin
     j:=i+k;
     f1[i,j]:=max(f2[i+1,j]+s,f2[i,j-1]+s[j]);
     f2[i,j]:=sum[j]-sum[i-1]-f1[i,j];
   end;
end;

procedure out;
var i:longint;
begin
 assign(output,ouf);rewrite(output);
 writeln(f1[1,n],' ',sum[n]-f1[1,n]);
 close(output);
end;

begin
 init;
 main;
 out;
end.

posted @ 2008-12-09 13:15  jesonpeng  阅读(179)  评论(0)    收藏  举报