我用的暴搜= =||程序如下:
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语言= =)
谢谢。
NOIP2000提高组第二题
答案:2 悬赏:70 手机版
解决时间 2021-02-04 04:08
- 提问者网友:沦陷
- 2021-02-03 13:39
最佳答案
- 五星知识达人网友:话散在刀尖上
- 2021-02-03 14:09
怎么可用搜索啊,明显是经典的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
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.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯