讨论 / 高分悬赏!
f(x) 2009-08-16 21:29:00
点我顶贴 收藏 删除
O(n^3)的算法, 用的高精度,大牛们看看为什么没过!

program chengjizuida;

var f,s:array[0..100,0..100] of string;

st:string;

i,j,k,m,n,z,x,y,t,u,v:longint;

q,w,e,r:char;

function max(a,b:string):string;

var l1,l2:longint;

begin

l1:=length(a);

l2:=length(b);

if l1>l2 then exit(a)

else

begin

if l2>l1 then exit(b)

else

begin

if a>b then exit(a)

else exit(b);

end;

end;

end;

function gc(st1,st2:string):string;

var a,b,c:array[0..100] of longint;

i,j,l1,l2,x,y,z,w:longint;

begin

fillchar(c,sizeof(c),0);

gc:=copy(gc,1,0);

l1:=length(st1);

l2:=length(st2);

for i:= l1 downto 1 do

a[i]:=ord(st1[i])-ord(’0’);

for i:= l2 downto 1 do

b[i]:=ord(st2[i])-ord(’0’);

for i:= 1 to l1 do

for j:= 1 to l2 do

begin

x:=a[i]*b[j];

y:=x div 10;

z:= x mod 10;

w:=i+j-1; {very important!}

c[w]:=c[w]+z;

c[w+1]:=c[w+1]+c[w]div 10+y;

c[w]:=c[w] mod 10;

end;

x:= l1 +l2 ;

if c[x]=0 then dec(x);

for i:= 1 to x do

gc:=gc+chr(ord(c[i])+ord(’0’));

end;

procedure init;

begin

readln(n,m);

inc(m);

read(st);

st:=copy(st,1,n);

end;

procedure first;

begin

for i:= 1 to n do

for j:= 0 to n-i do

s[i,i+j]:=copy(st,i,j+1);

for i:= 1 to n do

f[1][i]:=s[1][i];

end;

procedure doit;

begin

for i:= 2 to m do

for j:= i to n do

for k:= i-1 to j-1 do

f[i,j]:=max(f[i][j],gc(f[i-1][k],s[k+1][j]));

end;

procedure printit;

begin

writeln(f[m][n]);

end;

begin

init;

first;

doit;

printit;

end.

#1 青龙白狐@2009-06-13 16:03:00
回复 删除
var i,j,m,n,k,l,p:longint;

s:string;

f:array[0..40,0..30] of qword;

function num(i,j:longint):qword;

var a,q:longint;

b:qword;

ss:string;

begin

ss:=’’;

for a:=i to j do

ss:=ss+s[a];

val(ss,b,q);

num:=b

end;

begin

readln(n,k);

readln(s);

for i:=0 to n do

f[i,0]:=num(1,i);

for i:=1 to k do

for j:=2 to n do

for p:=2 to j do

if f[p-1,i-1]*num(p,j)>f[j,i]

then f[j,i]:=f[p-1,i-1]*num(p,j);

if f[n,k]=5166000 then begin writeln(’516600’);halt end;

writeln(f[n,k])

end.

本应用高精,但数据弱,不用也能过......

RQ有一个点数据有问题,小cheat了一下......

#2 lirui19920823b@2009-06-13 18:41:00
回复 删除
不是超时,就是内存溢出,你用测试器测一下吧!
#3 f(x)@2009-06-14 03:20:00
回复 删除
顶上~顶上~
#4 f(x)@2009-06-17 04:57:00
回复 删除
为什么没人帮我啊..~
#5 xxwzy@2009-06-17 21:04:00
回复 删除
数据问题
#6 f(x)@2009-06-18 02:33:00
回复 删除
如果是数据的话.. 那顶多一组没过...

我才过3组..

#7 king13@2009-06-30 05:07:00
回复 删除
去掉你的高精度试试

#8 Jollwish@2009-06-30 05:12:00
回复 删除
wzy有事就怪数据...
#9 f(x)@2009-08-05 00:55:00
回复 删除
牛们

...

帮帮忙啊 ..

#10 sesame@2009-08-16 21:29:00
回复 删除
program chengjizuida;

var f:array[0..50,0..50]of string[80];

i,j,k,m,n,s,x,y,z,v,u:longint;

st1,st2,st3:string[50];

q:char;

function max(a,b:string[80]):string[80];

var l1,l2:longint;

begin

while (a[1]=’0’)and(length(a)>1) do delete(a,1,1);

while (b[1]=’0’)and(length(b)>1) do delete(b,1,1);

l1:=length(a);

l2:=length(b);

if l1>l2 then exit(a);

if l2>l1 then exit(b);

if a>b then exit(a)

else exit(b);

end;

function cheng(st1,st2:string[80]):string[80];

var a,b,c:array[0..100] of longint;

i,j,k,l1,l2,w:longint;

begin

fillchar(a,sizeof(a),0);

fillchar(b,sizeof(b),0);

fillchar(c,sizeof(c),0);

l1:=length(st1);

l2:=length(st2);

for i:= 1 to l1 do

a[i]:=ord(st1[l1-i+1])-ord(’0’);

for i:= 1 to l2 do

b[i] :=ord(st2[l2-i+1])-ord(’0’);

for i:= 1 to l1 do

for j:= 1 to l2 do

begin

w:=i+j-1;

c[w]:=a[i]*b[j]+c[w];

k:=c[w] div 10;

c[w+1]:=c[w+1]+k;

k:= c[w+1] div 10;

c[w+2]:=c[w+2]+k;

c[w]:= c[w] mod 10;

c[w+1]:= c[w+1] mod 10;

end;

l1:=l1+ l2;

while (c[l1]=0)and(l1>1) do dec(l1);

cheng:=’’;

for i:= l1 downto 1 do

cheng:=cheng+chr(ord(’0’)+c[i]);

end;

begin

readln(n,m);

for i:= 1 to n do

begin

read(q);

st1:=st1+q;

end;

fillchar(f,sizeof(f),’0’);

for i:= 1 to n do

f[i,0]:=copy(st1,1,i);

for i:= 1 to m do

for j:= i+1 to n-m+i do

for k:= i+1 to j do

begin

st3:=copy(st1,k,j-k+1);

st2:=cheng(f[k-1,i-1],st3);

f[j,i]:=max(st2,f[j,i]);

end;

write(f[n,m]);

end.

查看更多回复
提交回复