题解

160 条题解

  • 0
    @ 2009-11-02 12:50:07

    世界上最痛苦的事情就是水题A不了

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    我太傻B了

  • 0
    @ 2009-11-01 20:27:54

    好恶心的题……

    搞了我好久

    有罪……祈祷一下

    ————————————

    动规:经典的石子合并再改动。用a[i]记录每个珠子的属性。

    两种方法:

    1.f表示从i到j合并的最大值。转移为f:=f+f[k+1,j]+a*a[k,2]*a[j,2]。 注意k可以比i小,j可以比k小,表示圈循环。输出max{f[i,(i+n-2) mod n+1}。

    2.f表示从i开始j个合并的最大值。转移为f:=f+f[(i+k-1) mod n+1,j-k]+a*a[(i+k-1) mod n+1,1]*a[(i+k-2) mod n+1,2]。输出max{f}。

    错误做法

    两种动规都有错误的写法(上下对应)。

    1.没有注意圈的循环。没有把k放在外层循环。(得分将会扣掉90。)

    2.没有把j放在外层循环。(得分将会扣掉50)。

  • 0
    @ 2009-10-30 22:06:05

    谁能帮我解释一下这里的

    for i:=1 to n do

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

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

    if b[j,i+j]

  • 0
    @ 2009-10-29 19:58:44

    F表示从第i个数到第j个数合并起来的最小值

    F:=MIN(F+F[k+1,j])+sum (i

  • 0
    @ 2009-10-24 19:51:28

    program v1;

    var n,v,i,k,j,l,max1:longint;

    a:array[1..250]of longint;

    f:array[1..250,1..250]of longint;

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

    begin

    if x>y then max:=x else max:=y;

    end;

    begin

    readln(n);

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

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

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

    for i:=1 to 2*n do f:=a[i]*a*a;

    for l:=2 to n-1 do

    for i:=1 to 2*n do

    begin

    j:=i+l;for k:=i to j-1 do f:=max(f+f[k+1,j]+a[i]*a[k+1]*a[j+1],f);

    end;

    max1:=0;for i:=1 to n do begin j:=i+n-1;max1:=max(f,max1);end;

    writeln(max1);

    readln;

    readln

    end.

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    秒杀;就是要用2倍数组,2倍搜索;

  • 0
    @ 2009-10-14 17:27:53

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    f:array[0..103,0..103]of longint;

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

    begin

    if x>y then max:=x else max:=y;

    end;

    begin

    readln(n);

    max1:=0;

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

    a[0]:=a[n];

    for t:=1 to n do

    begin

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

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

    for i:=1 to n do b[i]:=a[(i+t-1) mod n];

    b[0]:=b[n];

    for i:=n downto 1 do

    for j:=i+1 to n do

    for k:=i to j-1 do

    f:=max(f,f+f[k+1,j]+b[i]*b[(j+1) mod n]*b[(k+1) mod n]);

    if f[1,n]>max1 then max1:=f[1,n];

    end;

    writeln(max1);

    end.

    PUPPY神机!N四方算法差点秒杀

  • 0
    @ 2009-10-12 22:49:59

    编译通过...

    ├ 测试数据 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-07 12:57:21

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    将n个数扩展成一个长度为2n的链状,然后做n次dp,而且是for i=n downto 1 do;复杂度理论上是O(n^3),但是用了记忆化之后,其实是远小于O(n^3)的,但是肯定大于O(n^2);

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

    石子归并

  • 0
    @ 2009-09-26 11:24:41

    100题纪念......

  • 0
    @ 2009-09-18 16:56:03

    多少年了,我总算AC了...

    DP就是要注意+1,-1的问题,-1了以后就AC了...

  • 0
    @ 2009-09-06 20:46:55

    dp的转移方程是:

    Best=maxQ[1,n] 1

  • 0
    @ 2009-08-27 14:20:28

    交了N次 都是10分

    无奈 准备放弃

    又交了一次

    AC...

    耍我啊!!!!!vijos

  • 0
    @ 2009-08-25 20:40:03

    编译通过...

    ├ 测试数据 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-08-24 22:36:22

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

    #include"stdio.h"

    typedef struct

    { long x,y;

    long w;

    }node;

    int main()

    { long i,j,k,m=0,n,h=0;

    node max[101][101],data[101][101];

    long a[101];

    memset(max,0,sizeof(max));

    memset(data,0,sizeof(data));

    scanf("%ld",&n);

    for(i=1;i

  • 0
    @ 2009-08-19 14:09:34

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    var

    f:array[1..253,1..253] of longint;

    a,b:array[1..203] of longint;

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

    max:longint;

    begin

    readln(n);

    for i:=1 to n do begin

    read(a[i]);

    a[n+i]:=a[i];

    end;

    for i:=1 to n-1 do begin

    b[i]:=a;

    b:=b[i];

    end;

    b[n]:=a[1];

    b[2*n]:=b[n];

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

    for p:=1 to n-1 do

    for i:=1 to 2*n-2 do begin

    j:=i+p;

    if j>2*n-1 then break;

    for k:=i to j-1 do begin

    max:=f+f[k+1,j]+a[i]*b[k]*b[j];

    if ff then f:=max;

    end;

    max:=0;

    for i:=1 to n do if f>max then max:=f;

    writeln(max);

    end.

    “石子合并”问题,十分经典

  • 0
    @ 2009-08-18 15:30:41

    计算的时候忘了 mod n,WA 了3次。唉。。。。。。。。!

  • 0
    @ 2009-08-15 22:09:55

    好难,谁有更简洁的方法

  • 0
    @ 2009-08-14 11:03:42

    var

    n:integer;

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

    i,j,k:integer;

    b:array[1..250,1..250] of int64;

    max:qword;

    begin

    readln(n);

    for i:=1 to n do

    begin

    read(a[i]);

    a[n+i]:=a[i];

    end;

    for i:=1 to n do

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

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

    if b[j,i+j]

  • 0
    @ 2009-08-12 16:57:12

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    同志们注意啊!数据范围有误!

    数组开200不行

    要用250!

    血的教训啊!

信息

ID
1312
难度
4
分类
动态规划 | 环形DP 点击显示
标签
递交数
6953
已通过
2794
通过率
40%
被复制
14
上传者