题解

126 条题解

  • 0
    @ 2009-10-18 09:31:26

    记录每个区间的断点,然后递归得到算式,用数组记录每个数字左右两边有几个括号。

    procedure work(l,r:longint);

    var

    i,j,k:longint;

    begin

    inc(d[l,1],1);

    inc(d[r,2],1);

    if rl+1 then begin

    if c[l,r]>0 then work(l,l+c[l,r]);

    if l+c[l,r]+1b then exit(b);

    p:=k;

    exit(a);

    end;

    function dis(i,j:longint):longint;

    var k:longint;

    begin

    if b>0 then exit(b);

    dis:=0;

    for k:=i to j do inc(dis,a[k]);

    b:=dis;

    end;

    begin

    fillchar(s,sizeof(s),0);

    fillchar(d,sizeof(d),0);

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

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

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

    readln(n);

    for i:=1 to n do read(a[i]);

    for i:=1 to n-1 do f:=dis(i,i+1);

    for i:=3 to n do

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

    begin

    f[j,j+i-1]:=maxlongint;

    for k:=0 to i-2 do

    f[j,j+i-1]:=min(f[j,j+k]+f[j+k+1,j+i-1]+dis(j,j+i-1),f[j,j+i-1]);

    c[j,j+i-1]:=p;

    end;

    t:=1;

    work(1,n);

    for i:=1 to n do

    begin

    for j:=1 to d do write('(');

    write(a[i]);

    for j:=1 to d do write(')');

    if in then write('+');

    end;

    writeln;

    writeln(f[1,n]);

    for i:=1 to t-2 do write(s[i],' ');writeln(s[t-1]);

    end.

  • 0
    @ 2009-10-17 21:42:34

    procedure dfs(x,y:longint);

    var t:longint;

    begin

    inc(l);

    u[l]:=sum[x,y];

    t:=g[x,y];

    inc(left[x]);

    inc(right[y]);

    if abs(y-t)>1 then begin dfs(t+1,y);end; 0 then begin dfs(x,t);end;

    end;

    两个小时后全A。。。

    注意大于等于。。

    感谢张牛。T_T

    我只有一个问题。。。

    我的括号是右优先。。。

    LS几位说的都是左优先。。。?

    算法不同?还是我理解错误?

  • 0
    @ 2009-10-12 20:19:01

    括号是靠左输出的,楼下说靠右输出的请经过大脑思考后再下结论。

    提供一组数据

    3

    2 2 2

    答案是

    ((2+2)+2)

    10

    4 6

    50行搞定

    Const Maxn=20;

    Var f,pre:array[1..Maxn,1..Maxn]of longint;

    a,left,right:array[1..Maxn]of longint;

    sum,ans:array[0..Maxn]of longint;

    n,i,j,k:longint;

    Procedure dfs(l,len:integer);

    var mid:integer;

    begin

    inc(left[l]); inc(right[l+len-1]);

    mid:=pre[l,len];

    if mid>1 then dfs(l,mid);

    if len-mid>1 then dfs(l+mid,len-mid);

    inc(ans[0]); ans[ans[0]]:=f[l,len]-f[l,mid]-f[l+mid,len-mid];

    end;

    Begin

    readln(n);

    sum[0]:=0;

    for i:=1 to n do begin

    read(a[i]);

    inc(sum[i],sum+a[i]);

    end;

    for i:=1 to n do f:=0;

    for j:=2 to n do

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

    f:=maxlongint;

    for k:=1 to j-1 do

    if f+f+sum-sum

  • 0
    @ 2009-10-11 15:29:25

    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbug啊啊啊啊啊啊

    80分的注意了注意了啊啊啊啊···转移的时候一定要

  • 0
    @ 2009-10-10 00:14:40

    竟然有多解!!!!!!!!!!!

    ---|---|---|---|---|---|---|---|---|---|--

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var ans,n:longint;s,a:array[0..30]of longint;

    r,f:array[0..30,0..30]of longint;

    function find(i,j:longint):longint;

    var k,t,z:longint;

    begin

    if f

  • 0
    @ 2009-10-07 21:12:37

    好猥琐的输出!!!

    program p1038;

    var a:array[1..20]of integer;

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

    data:array[0..20,0..20]of longint;

    s:array[0..20]of longint;

    s1:string;

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

    begin

    if x

  • 0
    @ 2009-10-06 20:12:42

    这么水的题竟然提交了十几次!!!!!!!

    题目描述想杀人啊

    首先多解要保存括号在左边的

    其次第三行是从左到右,由里到外!!!!!!!!!!!!!!!!!

  • 0
    @ 2009-10-04 12:31:12

    不要听下面的人胡说- -

    括号是输出最靠左的,1A是证据

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2009-10-01 09:10:43

    太猥琐了居然不说清楚,必须输出最靠右的

  • 0
    @ 2009-09-27 21:39:01

    由于我是个沙茶,只能用建立二叉树的方法输出,也就80行....

  • 0
    @ 2009-09-27 21:10:17

    终于修成正果了

    程序还是长的要死

    program p1038;

    var

    f,way,sum,b:array[0..20,0..20] of longint;

    n:longint;

    a:array[1..20] of integer;

    procedure init;

    var

    i,j:longint;

    begin

    readln(n);

    for i:=1 to n do

    begin

    read(a[i]);

    sum:=a[i];

    end;

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

    for i:=1 to n do

    for j:=1 to n do

    f:=-1;

    for i:=1 to n do

    for j:=i+1 to n do

    begin

    sum:=sum+a[j];

    end;

    end;

    function search(l,r:longint):longint;

    var

    i,kk,j:longint;

    begin

    if l>=r then

    exit(0);

    if l

  • 0
    @ 2009-09-24 13:25:28

    石子合并

    感谢 Mato完整版 的提示:

    Hint:

    在有多解的情况下,输出括号最靠右的。

  • 0
    @ 2009-09-22 16:48:16

    膜拜fenghao大牛、

  • 0
    @ 2009-09-21 17:21:09

    if(f

  • 0
    @ 2009-09-20 12:09:26

    Hint:

    在有多解的情况下,输出括号最靠右的。

  • 0
    @ 2009-09-17 21:55:32

    这题很XX

    不解释

  • 0
    @ 2009-09-16 17:44:41

    var i,j,n,min,mink,k,h,p:integer;

    a,h1,h2,b:array[1..100] of integer;

    f,sz,wei:array[1..100,1..100] of integer;

    procedure jia(x:integer);

    begin

    inc(p); b[p]:=x;

    end;

    procedure jk(s,w:integer);

    begin

    if s=w then exit;

    inc(h1); inc(h2[w]);

    if s+1=w then begin jia(sz);exit; end;

    jk(s,wei); jk(wei+1,w);

    jia(sz);

    end;

    begin

    readln(n);

    for i:=1 to n do begin read(a[i]); sz:=a[i]; end;

    for i:=1 to n-1 do

    for j:=i+1 to n do sz:=sz+a[j];

    for i:=1 to n-1 do f:=sz;

    for h:=2 to n-1 do

    for i:=1 to n-h do

    begin

    j:=i+h;

    min:=f; mink:=i;

    for k:=i+1 to j-1 do if f+f[k+1,j]

  • 0
    @ 2009-09-15 23:01:22

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    program v1038;

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

    g,f:array[0..21,0..21] of longint;

    i,j,k,n,temp:longint;

    procedure print(i,j:longint);

    var k:longint;

    begin

    if i=j

    then begin

    write(a[i]-a);

    exit;

    end;

    k:=g;

    write('(');

    print(i,k);

    write('+');

    print(k+1,j);

    write(')');

    end;

    procedure draw(i,j,x:longint);

    var k,t:longint;

    begin

    k:=g;

    t:=x-(a[j]-a[k]);

    if k>i

    then begin

    draw(i,k,t);

    write(t,' ');

    end;

    t:=x-(a[k]-a);

    if j>k+1

    then begin

    draw(k+1,j,t);

    write(t,' ');

    end;

    end;

    begin

    readln(n);

    for i:=1 to n do

    begin

    read(f);

    a[i]:=a+f;

    end;

    for j:=2 to n do

    for i:=j-1 downto 1 do

    begin

    temp:=maxlongint;

    for k:=i to j-1 do

    if temp>f+f[k+1,j]

    then begin

    temp:=f+f[k+1,j];

    g:=k;

    end

    else if temp=f+f[k+1,j]

    then g:=k;

    f:=temp+(a[j]-a);

    end;

    print(1,n);

    writeln;

    writeln(temp);

    draw(1,n,a[n]);

    writeln(a[n]);

    end.

    一次Ac,留念

    练递归呀这题……

  • 0
    @ 2009-09-15 21:18:43

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    < 80分

  • 0
    @ 2009-09-15 20:54:44

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    写挫了 92行

    鄙视诡异的输出

信息

ID
1038
难度
5
分类
动态规划 点击显示
标签
(无)
递交数
2724
已通过
1011
通过率
37%
被复制
10
上传者