永发信息网

NOIP2000提高组第二题

答案:2  悬赏:70  手机版
解决时间 2021-02-04 04:08
我用的暴搜= =||程序如下:
var
n,k:longint;
ans:extended;
f:string;

function js(i,j:longint):extended;
var
t:string;
a:extended;
begin
t:=copy(f,i,j-i+1);
val(t,a);
exit(a);
end;

procedure dfs(depth:longint;tot:extended;wz:longint);
var
i,t:longint;
begin
if depth>n then exit;
if wz=k+1 then begin
if tot>ans then ans:=tot;
exit;
end;
for i:=depth+1 to n do dfs(i,tot*js(depth+1,i),wz+1);
end;

begin
readln(n,k);
readln(f);
ans:=0;
dfs(0,1,0);
writeln(ans:0:0);
end.
已经剪枝过了,可还是超时。能帮忙修改一下么?
最好还可以用搜索而且AC。
如果搜索再怎么剪枝都不能AC的话,那就给一种DP方法。
最好在代码旁边写上详细注释。
最好使用pascal语言(用Qbasic也行,不过我没有学过C语言= =)
谢谢。
最佳答案
怎么可用搜索啊,明显是经典的DP
f[i,j]表示前i个数添加j个乘号
明显f[i,0]:=a[1,i];//a[i,j]表示那个数第i位到第j位的数值
f[i,j]:=max(f[k,j-1]*a[k+1,i])//k
全部回答
  • 1楼网友:往事隔山水
  • 2021-02-03 15:04
先找一下里面的字母 write(那个字母,'=') 然后找字母前面的系数(“=”之前)存在sumx1里 找普通的数字(后面没有字母的)(“=”之前)存在sum1里 再找字母前面的系数(“=”之后)存在sumx2里 找普通的数字(后面没有字母的)(“=”之后)存在sum2里 writeln((sum1-sum2)/(sumx1-sumx2)) 没带u盘,不能给程序 var v:char; a,b,c,d,p:integer; s:string; procedure analyse(s:string; var x,y:integer); var p,f,m:integer; {p:index f:sign m:number} begin x:=0; y:=0; p:=1; repeat {read number} f:=1; m:=0; case s[p] of '-': begin f:=-1; inc(p); end; '+': begin f:=1; inc(p); end; end; if s[p]=v then m:=1; while (p<=length(s)) and (s[p] in ['0'..'9']) do begin m:=m*10+ord(s[p])-ord('0'); inc(p); end; if (p<=length(s))and(s[p]=v) then begin x:=x+m*f; inc(p); end else y:=y+m*f; until p>length(s); end; begin readln(s); p:=pos('=',s); for v:='a' to 'z' do if pos(v,s)>0 then break; analyse(copy(s,1,p-1),a,b); analyse(copy(s,p+1,length(s)-p),c,d); writeln(v,'=',(d-b)/(a-c):0:3); end.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯