2007提高组复赛里的第三题的状态转移方程和标程是什么

来源:百度知道 编辑:UC知道 时间:2024/06/08 02:32:39
加上说明,拜托,用pascal

f(i,j)=max(f(i+1,j)*2^(n-j+i-1)+a[i+1,j],f(i,j-1)*2^(n-j+i-1)+a[i,j-1])

就是左边取一下,右边取一下,看谁大
注意到每一行都是独立的一个结构,因此可以把每一行的答案全部加起来就是最后答案。

对于每一行,有状态转移方程:f(i,j) = 2*max(a(i)+f(i+1,j),a(j)+f(i,j-1)),边界f(i,i)=2*a(i),其中f(i,j)表示从i到j这一子段单独操作可以达到的最大权值。最后答案就把每一行的f(0,m-1)加起来即可。这里可以算得答案不超过30位10进制数,所以高精度的数组开到30足够了。乘法也不用写,用两次加法即可

program game;
type stack=array [0..30]of longint;
var
i,j,k,t:longint;
m,n:longint;

p,pp:stack;
b:array [1..100]of stack;
a:array [1..100,1..100]of stack;
total:stack;

function bigger(a,b:stack):boolean;var i,l:longint;
begin
if a[0]>b[0] then exit(true);if a[0]<b[0] then exit(false);
for i:=a[0] downto 1 do if a[i]>b[i] then exit(true) else if a[i]<b[i] then exit(false);
bigger:=true;
end;

procedure add(a,b:stack;var c:stack);var i,j,t:longint;
begin
t:=0; if a[0]>b[0] then j:=a[0] else