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.
这种类型的题目还要多加练习....