讨论 / 求大牛找错,过了3个点,其他的答案都是一个绝对值很大的负数
legolas 2010-11-10 01:19:00
点我顶贴 收藏 删除
大牛帮我看看dp哪错了啊?

f[i,j].i表示第i个点,j=1表示上升0表示下降。

k是把环形分成长度为n的k段

谢谢了

var n,m,i,j,k,t:longint;

a:array[0..20009]of longint;

f:array[0..20009,0..1]of longint;

ans:array[1..10000]of longint;

function min(x,y:longint):longint;

begin

if x<y then min:=x

else min:=y;

end;

begin

readln(n,m);

for i:=1 to n do begin

read(j);

a[i]:=j;

a[i+n]:=j;

end;

for k:=1 to n-1 do begin

f[k,1]:=0; f[k,0]:=0;

for i:=k+1 to k+n do

for j:=0 to 1 do begin

if j=1 then if (a[i-1]-a[i])<0 then

f[i,j]:=min(f[i-1,0]+m,f[i-1,1])+abs(a[i-1]-a[i])

else

f[i,j]:=min(f[i-1,0]+m,f[i-1,1])+abs(a[i-1]-a[i])*abs(a[i-1]-a[i]);

if j=0 then if a[i-1]-a[i]>0 then

f[i,j]:=min(f[i-1,0],f[i-1,1]+m)+abs(a[i-1]-a[i])

else

f[i,j]:=min(f[i-1,0],f[i-1,1]+m)+abs(a[i-1]-a[i])*abs(a[i-1]-a[i]);

end;

ans[k]:=min(f[k+n,1],f[k+n,0]);

end;

m:=maxlongint;

for i:=1 to n-1 do

if ans[i]<m then m:=ans[i];

writeln(m);

end.

#1 奇异夸克@2010-11-06 21:06:00
回复 删除
要用longlong哦
#2 liubingqian@2010-11-07 05:11:00
回复 删除
int64都不行,要用qword!
#3 legolas@2010-11-07 06:27:00
回复 删除
这些是什么啊。。。。。。大牛,qword在比赛中能用吗?

好像int64都不行

#4 pkf@2010-11-08 05:02:00
回复 删除
我。。。。。。。。。。

我不想呸你!

二维写不好,就写三维!

#5 pkf@2010-11-08 05:28:00
回复 删除
我。。。。。。。。。。

写的好好,去看TYVJ的题解,那就是我的。

#6 好人@2010-11-10 01:19:00
回复 删除
用double
查看更多回复
提交回复