题解

175 条题解

  • 0
    @ 2009-06-12 15:01:25

    AC:

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    program message;

    var

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

    num :array[1..60,1..60]of longint;

    ans :array[1..60,1..60,1..60]of longint;

    begin

    readln(m,n);

    for i:=1 to m do

    for j:=1 to n do read(num);

    fillchar(ans,sizeof(ans),255);

    ans[2,1,2]:=num[2,1]+num[1,2];

    for i:=2 to m do

    for j:=1 to n do

    for k:=j+1 to n do

    begin

    if i+j

  • 0
    @ 2009-05-30 01:35:59

    直接四维或者旋转45度压成三维

  • 0
    @ 2009-05-21 17:30:57

    位运算做法

    var

    f :array[2..100,1..50,1..50]of longint;

    g :array[1..50,1..50]of longint;

    m,n,i,j,k,x1,x2,nx1,nx2,ny1,ny2:longint;

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

    begin

    if x>y then exit(x) else exit(y);

    end;

    begin

    read(m,n);

    for i:=1 to m do

    for j:=1 to n do

    read(g[j,i]);

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

    f[2,1,2]:=g[1,2]+g[2,1];

    for k:=3 to n+m-2 do

    for x1:=1 to n-1 do

    for x2:=x1+1 to n do

    for j:=0 to 3 do

    begin

    nx1:=x1+j and 1;

    nx2:=x2+j shr 1 and 1;

    if (nx1>n)or(nx2>n)or(nx1=nx2) then continue;

    ny1:=k+1-nx1;ny2:=k+1-nx2;

    if (ny1m) then continue;

    f[k,nx1,nx2]:=max(f[k,nx1,nx2],f[k-1,x1,x2]+g[nx1,ny1]+g[nx2,ny2]);

    end;

    writeln(f[m+n-2,n-1,n]);

    end.

  • 0
    @ 2009-05-08 13:57:16

    #include

    int f(int,int,int);

    int map[100][100],m,n,num[110][60][60];

    main()

    {

    scanf ("%d%d",&m,&n);

    int i,j;

    for (i=0;i

  • 0
    @ 2009-08-03 11:52:40

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    可用三维的动规,可惜当年考试时...唉

    d[k,i,j]:=max(d[k-1,i-1,j-1],d[k-1,i-1,j],d[k-1,i,j-1],d[k-1,i,j])+a[x1,i]+a[x2,j];

  • 0
    @ 2009-04-26 12:30:30

    这题蛮简单的,我是三重循环+三维数组的。.0MS秒杀,其实大家完全可以跳出这道题,当成两个人一起走这个矩阵.都是从左上角走到右下角,这样得出的结果也是一样的,并且只需要三重循环.

    我用x表示阶段,我是来斜着划分阶段的,i和j表示两个人在这个阶段上的坐标.方程就可以列出来了.

    if ij

    then

    t:=a+a[j,x-j+1]

    else

    t:=0; {因为这里是两个人都到了同一个点上,是不能传两次,所以设为0}

    f[x,i,j]:=t+max(f[x-1,i-1,j],max(f[x-1,i-1,j-1],max(f[x-1,i,j-1],f[x-1,i,j])));

    希望能对大家提供一些帮助!

  • 0
    @ 2009-04-22 17:11:10

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    我无语了,同样的思想,想法。考场上怎么就没做出来?!!

    当时都是这么想的 = = , 结果....

    2008 NOIP 我败得太可怜了!

  • 0
    @ 2009-04-11 21:44:56

    dp[i1][i2][j1][j2]=max(

    dp[i1+1][i2+1][j1][j2],

    dp[i1+1][i2][j1][j2+1],

    dp[i1][i2+1][j1+1][j2],

    dp[i1][i2][j1+1][j2+1])+p[i1][j1]+p[i2][j2]

    用的是记忆搜索

    以前记忆搜索判断是否存在值总是在dfs前判断,这回我全部改到dfs开头判断了~~代码量大大缩短。

  • 0
    @ 2009-03-24 23:34:24

    program vijos1493;

    var

    m,n,i,j,i1,j1,p:longint;

    a:array[1..50,1..50]of longint;

    f:array[0..51,0..51,0..51,0..51]of integer;

    function max(a,b,c,d:longint):longint;

    begin

    max:=a;

    if b>max then max:=b;

    if c>max then max:=c;

    if d>max then max:=d;

    end;

    begin

    readln(m,n);

    for i:=1 to m do

    begin

    for j:=1 to n do read(a);

    readln;

    end;

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

    for i:=1 to m do

    for j:=1 to n do

    for i1:=1 to m do

    for j1:=1 to n do

    begin

    p:=max(f,f,f,f);

    if ((i=i1)and(j=j1)) then f:=p+a

    else f:=p+a+a[i1,j1];

    end;

    writeln(f[m,n,m,n]);

    end.

    最好理解的4维

  • 0
    @ 2009-03-19 14:15:31

    program chuanzhitiao;

    var a:array[-1..50,-1..50] of integer;

    f:array[0..500,-1..50,-1..50] of longint;

    i,j,k,l,n,m:longint;

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

    begin

    if a>b then exit(a) else exit(b);

    end;

    begin

    readln(m,n);

    for i:=0 to m-1 do

    for j:=0 to n-1 do

    read(a);

    f[0,0,0]:=0;

    for k:=1 to n+m-3 do

    for i:=0 to n-2 do

    if (i>k) then break

    else

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

    if (ij) and (j=0) and (k-j>=0) then

    begin

    if (j-i)>1

    then f[k,i,j]:=max(max(f[k-1,i-1,j-1],f[k-1,i-1,j])

    ,max(f[k-1,i,j-1],f[k-1,i,j]))+a[k-i,i]+a[k-j,j]

    else

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

    end;

    end;

    writeln(f[k,n-2,n-1]) ;

    end.

    打击我的积极性,写4维还过,3维秒杀,2维不想写了

  • 0
    @ 2009-03-03 08:32:18

    program qu;

    var data:array[1..50,1..50]of integer;

    sum:array[0..50,0..50,0..50,0..50]of longint;

    m,n,i,j,i1,j1,i2,j2:integer;

    p:longint;

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

    begin

    if a>b then max:=a else max:=b;

    end;

    begin

    fillchar(data,sizeof(data),0);

    fillchar(sum,sizeof(sum),0);

    readln(m,n);

    for i:=1 to m do

    begin

    for j:=1 to n do

    read(data);

    readln;

    end;

    for i1:=1 to m do

    for j1:=1 to n do

    for i2:=1 to m do

    for j2:=1 to n do

    if ((j2j1)and(i1i2))or((i1=m)and(i2=m)and(j1=n)and(j2=n)) then begin

    p:=max(sum[i1-1,j1,i2-1,j2],sum[i1-1,j1,i2,j2-1] );

    p:=max(p,sum[i1,j1-1,i2-1,j2]);

    p:=max(p,sum[i1,j1-1,i2,j2-1]);

    sum[i1,j1,i2,j2]:=p+data[i1,j1]+data[i2,j2];

    end;

    writeln(sum[m,n,m,n]);

    end.

  • 0
    @ 2009-02-20 17:29:52

    var i,j,m,n,k,p,l,d1,d2:longint;

    x,y,xx,yy,x1,x2,y1,y2:longint;

    a,f,f1:array[1..500,1..500] of longint;

    b:array[1..500,1..500] of boolean;

    begin

    readln(n,m);

    fillchar(b,sizeof(b),false);

    for i:=1 to n do

    for j:=1 to m do

    begin

    read(a);

    b:=true

    end;

    k:=n+m-1;

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

    for i:=2 to k do

    begin

    fillchar(f1,sizeof(f1),0);

    for x1:=1 to i-1 do

    for x2:=1 to i-1 do

    begin

    y1:=i-x1;

    y2:=i-x2;

    if b[x1,y1] and b[x2,y2] and((x1x2)or(i=2))then

    for d1:=0 to 1 do

    for d2:=0 to 1 do

    begin

    if d1=0 then begin x:=x1+1;y:=y1 end

    else begin x:=x1;y:=y1+1 end;

    if d2=0 then begin xx:=x2+1;yy:=y2 end

    else begin xx:=x2;yy:=y2+1 end;

    if ((xxx)or(i=k))and b[x,y] and b[xx,yy] then

    if f[x1,x2]+a[x,y]+a[xx,yy]>f1[x,xx]

    then begin f1[x,xx]:=f[x1,x2]+a[x,y]+a[xx,yy];

    end

    end

    end;

    f:=f1

    end;

    writeln(f[n,n])

    end.

    2维......

  • 0
    @ 2009-02-19 17:17:56

    考试的时候做不出来郁闷的 啊 ~~~~~~~~~~~··

    极度郁闷~

  • 0
    @ 2009-02-14 22:37:10

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    program 1493

    const

    s:array[1..2,1..2] of integer=((0,-1),(-1,0))

    varr

    k,i1,i2,j1,j2,m,n,r,l,i,j,P:longint;

    a:array[1..50,1..50] of longint;

    d:array[3..100,1..50,1..50] of longint;

    begin

    readln(m,m);

    for i:=1 to n do

    begin

    for j:=1 to m do

    begin

    read(a);

    end;

    readln;

    end;

    d[3,1,2]:=a[1,2]+a[2,1];

    for k:=4 to n+m do

    begin

    for i:=1 to n do

    if (k-i>=1) and (k-i=1) and (k-i=1)and(j1+s[r,2]>=1)and(i2+s[l,1]>=1)and(j2+s[l,2]>=1)and(i1+s[r,1]i2+s[l,1])and

    (d[k,i1,i2]

  • 0
    @ 2009-02-13 20:31:11

    最大费用流。

  • 0
    @ 2009-02-04 20:40:35

    编译通过...

    ├ 测试数据 01:运行超时|无输出...

    ├ 测试数据 02:运行超时|无输出...

    ├ 测试数据 03:运行超时|无输出...

    ├ 测试数据 04:运行超时|无输出...

    ├ 测试数据 05:运行超时|无输出...

    ├ 测试数据 06:运行超时|无输出...

    ├ 测试数据 07:运行超时|无输出...

    ├ 测试数据 08:运行超时|无输出...

    ├ 测试数据 09:运行超时|无输出...

    ├ 测试数据 10:运行超时|无输出...

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

    Unaccepted 有效得分:0 有效耗时:0ms

    囧~~~~~~~~~~~

  • 0
    @ 2009-02-03 19:00:01

    编译通过...

    ├ 测试数据 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-02-01 14:52:58

    囧……我考试的时候拼命提醒自己:这是多进程DP……这是多进程DP……这是多进程DP……问题就是忘记怎么实现了……

  • 0
    @ 2009-11-07 19:07:47

    var

    f : array[0..99,0..50,0..50]of longint;

    a : array[1..99,1..50]of longint;

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

    begin

    for i:=1 to 99 do

    for j:=1 to 50 do a:=-1;

    readln(m,n);

    for i:=1 to m do

    begin

    y:=i;x:=1;

    for j:=1 to n do

    begin

    read(t);

    a[y,x]:=t;

    y:=y+1;

    x:=x+1;

    end;

    end;

    for i:=2 to m+n-2 do

    for j:=1 to n do

    if a-1 then

    for k:=1 to n do

    if (jk)and(a-1)and(k>j) then

    begin

    f:=a+a;

    if f+a+a>f then f:=f+a+a;

    if f+a+a>f then f:=f+a+a;

    if f+a+a>f then f:=f+a+a;

    if f+a+a>f then f:=f+a+a;

    end;

    writeln(f[m+n-2,n-1,n]);

    end.

  • 0
    @ 2009-01-08 19:56:26

    自己的程序考试时AC

    交道Vijos上 就WA了……

    AC率……

    Orz..................

信息

ID
1493
难度
5
分类
动态规划 点击显示
标签
递交数
6702
已通过
2504
通过率
37%
被复制
9
上传者