vijos p1143(三取方格数)(100)

多线程 DP。

真心觉得这个方程不好想!

设f[k,i,j,l], 表示走第k步,第一个人,第二个人和第二个人各走到第I行,第j行和第L行所能得到的最优解(我们规定前一个人比后一个人先走!)。

状态转移:

规定 t[1]:=0; t[2]:=-1;

for w:=1 to 2 do

  for q:=1 to 2 do

    for p:=1 to 2 do

  f[k,i,j,l]:=max(f[k,i,j,l],f[k-1,i+t[w],i+t[q],l+t[p]])

共有八种状态转移的方式!

接下来:由于更新了 i,j,l 并规定了前一个人比后一个人先走所以:

有 f[k,i,j,l]:=f[k,i,j,l]+s[i,k-i+1].

接下来,如果有i<>j说明 第二个人当前的状态还没有人走过,所以我们可以

f[k,i,j,l]:=f[k,i,j,l]+s[j,k-j+1].

同理 如果有 l<>j 且 l<>i 我们有:

f[k,i,j,l]:=f[k,i,j,l]+s[j,k-l+1].

我们共要走 2*n-1步。

所以 ans:=f[2*n-1,n,n,n].

 1 rogram p1143; uses math;
 2 const
 3         t:array[1..2]of longint=(0,-1);
 4 var
 5         i,j,k,l,m,n,w,p,q:longint;
 6         f:array[0..41,-20..20,-20..20,-20..20]of longint;
 7         s:array[0..20,0..20]of longint;
 8 begin
 9         read(n);
10         for i:=1 to n do
11                 for j:=1 to n do
12                         read(s[i,j]);
13         for k:=1 to 2*n-1 do
14                 for i:=1 to k do
15                         for j:=1 to k do
16                                 for l:=1 to k do
17                                         begin
18                                         begin
19                                         for w:=1 to 2 do
20                                                 for p:=1 to 2 do
21                                                         for q:=1 to 2 do
22                                         f[k,i,j,l]:=max(f[k,i,j,l],f[k-1,i+t[w],j+t[p],l+t[q]]);
23                                         end;
24                                         f[k,i,j,l]:=f[k,i,j,l]+s[i,k-i+1];
25                                         if(i<>j)then f[k,i,j,l]:=f[k,i,j,l]+s[j,k-j+1];
26                                         if(i<>l)and(j<>l)then f[k,i,j,l]:=f[k,i,j,l]+s[l,k-l+1];
27                                         end;
28         write(f[2*n-1,n,n,n]);
29 end.                

这种类型的题目还要多加练习....

posted @ 2012-12-08 20:45  改名字干什么  阅读(262)  评论(0编辑  收藏  举报