USACO 5.4 Canada Tour dp

来源:互联网 发布:河北网络干部学院辅助 编辑:程序博客网 时间:2024/05/22 14:44

把返回的路线反向,那么整条路线就变成了两条不相交的从起点到终点的路线。这样我们可以用DP解决。

状态设定

f[i,j] 为假定的甲乙两人,甲走到第i个城市,乙走到第j个城市时,两人走过的城市数目的和。

初始状态

f[1,1]=1

状态转移方程

f[j,i]=f[i,j]=max{f[i,k]+1}(k到j存在飞机航线,以及f[i,k]>0,就是说存在f[i,k]的走法,1<=k<j

交换甲乙,则肯定有f[j,i]=f[i,j]。

代码:

{ID: ymebegi1PROG: tourLANG: PASCAL}var  n,m,i,j,k,x,y,ans:longint;  c:char;  s:string;  nam:array[1..100] of string;  a,f:array[1..100,1..100] of longint;procedure dfs(x:longint);var  i:longint;begin  for i:=x+1 to n do    if a[x,i]=1 then    begin      f[x,i]:=1;      dfs(i);      for j:=i+1 to n do        if f[i,j]+1>f[x,j] then f[x,j]:=f[i,j]+1;    end;end;begin  assign(input,'tour.in');  assign(output,'tour.out');  reset(input);  rewrite(output);  readln(n,m);  for i:=1 to n do    readln(nam[i]);  for i:=1 to m do  begin    read(c);    s:='';    while c<>' ' do    begin      s:=s+c;      read(c);    end;    for j:=1 to n do      if s=nam[j] then      begin        x:=j;        break;      end;    readln(s);    for j:=1 to n do      if s=nam[j] then      begin        y:=j;        break;      end;    a[y,x]:=1;    a[x,y]:=1;  end;  f[1,1]:=1;  for i:=1 to n-1 do    for j:=i+1 to n do    begin      for k:=1 to j-1 do        if (a[k,j]=1)and(f[i,k]>0)and(f[i,k]+1>f[i,j]) then          f[i,j]:=f[i,k]+1;      f[j,i]:=f[i,j];    end;  ans:=1;  for i:=1 to n-1 do    if (a[i,n]=1)and(f[i,n]>ans) then ans:=f[i,n];  writeln(ans);  close(input);  close(output);end.


0 0
原创粉丝点击