358 条题解

  • 0
    @ 2013-04-06 17:03:17

    较简单
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>

    int n, m, d[2][4]={0,0,1,-1,1,-1,0,0};
    int f[505][505], map[505][505];
    int know[505][505] = {0};

    int Mean (int x, int y) {
    if (x <= 0 || x > n || y <= 0 || y > m)
    return -1;
    return 0;
    }

    int Max (int array[5], int p, int x, int y) {
    int i, max = f[x][y];
    for (i = 1; i <= p; i++) {
    int tx=d[0][array[i]]+x, ty=d[1][array[i]]+y;
    max = max < f[tx][ty] ? f[tx][ty] : max;
    }
    if (max == f[x][y])
    return max;
    return max+1;
    }

    int DFS (int x, int y, int dir) {
    int i, flag = 0, array[5], p = 0;
    for (i = 0; i < 4; i++) {
    int tx=d[0][i]+x, ty=d[1][i]+y;
    if (abs (i-dir) == 1 && i+dir != 3)
    continue;
    if (Mean (tx, ty) == -1)
    continue;
    if (map[tx][ty] <= map[x][y])
    continue;
    flag = 1;
    array[++p] = i;
    if (know[tx][ty] == 0)
    DFS (tx, ty, i);
    }
    if (flag == 0) {
    f[x][y] = 1;
    }
    else {
    f[x][y] = Max (array, p, x, y);
    }
    know[x][y] = 1;
    }

    int main () {
    int i, j, ans = 0;
    scanf ("%d %d", &n, &m);
    for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
    scanf ("%d", &map[i][j]);
    for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++) {
    DFS (i, j, -22);
    ans = ans < f[i][j] ? f[i][j] : ans;
    }
    printf ("%d", ans);
    //system ("pause");
    return 0;
    }

  • 0
    @ 2012-10-31 21:49:28

    编译通过...

    ├ 测试数据 01:运行时错误... (0ms, 620KB)

    读取访问违规, 地址: 0x00001f64

    ├ 测试数据 02:运行时错误... (0ms, 620KB)

    读取访问违规, 地址: 0x00000569

    ├ 测试数据 03:运行时错误... (0ms, 620KB)

    读取访问违规, 地址: 0x00416058

    ├ 测试数据 04:答案正确... (0ms, 620KB)

    ├ 测试数据 05:运行时错误... (0ms, 620KB)

    读取访问违规, 地址: 0x0000054b

    ├ 测试数据 06:答案正确... (0ms, 620KB)

    ├ 测试数据 07:运行时错误... (0ms, 620KB)

    读取访问违规, 地址: 0x004160a8

    ├ 测试数据 08:运行时错误... (0ms, 620KB)

    读取访问违规, 地址: 0x00001e33

    ├ 测试数据 09:运行时错误... (0ms, 620KB)

    读取访问违规, 地址: 0x00008f6d

    ├ 测试数据 10:运行时错误... (0ms, 620KB)

    读取访问违规, 地址: 0x00002710

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

    Unaccepted / 20 / 0ms / 620KB

    今天听老师讲这道题,自己写出来了,把程序粘到VJ上,完全没看题……

    直到读取访问违规让我WA了4次之后,我看题解,

    才发现你们的数组都是[1..500,1..500]的……

    悲剧的我以为是原数据范围,开了[1..100,1..100]的数组……

    编译通过...

    ├ 测试数据 01:答案正确... (0ms, 2544KB)

    ├ 测试数据 02:答案正确... (0ms, 2544KB)

    ├ 测试数据 03:答案正确... (0ms, 2544KB)

    ├ 测试数据 04:答案正确... (0ms, 2544KB)

    ├ 测试数据 05:答案正确... (0ms, 2544KB)

    ├ 测试数据 06:答案正确... (0ms, 2544KB)

    ├ 测试数据 07:答案正确... (0ms, 2544KB)

    ├ 测试数据 08:答案正确... (0ms, 2544KB)

    ├ 测试数据 09:答案正确... (0ms, 2544KB)

    ├ 测试数据 10:答案正确... (0ms, 2544KB)

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

    Accepted / 100 / 0ms / 2544KB

    改了[1..500,1..500]后,其他地方没改,就AC了……

    提醒人们不要粘标程!注意改过的数据范围!

  • 0
    @ 2012-10-30 07:53:47

    快排。存坐标。用坐标存线性表中的序号。每次看他在矩阵中可以到的点是否在他线性表中位置的后面。然后DP。。

  • 0
    @ 2012-10-24 19:24:24

    记忆化搜索,将每次搜索的结果保存到F[]数组中

    program happy;

    const dx:array[1..4]of integer=(0,1,0,-1);

          dy:array[1..4]of integer=(1,0,-1,0);

    var n,m,max,s,i,j,x,y:longint;

       a,f:array[0..110,0..110]of longint;

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

    var xx,yy,e:longint;

    begin

      if f[x,y]>0 then exit(f[x,y]);

      f[x,y]:=1;

      for e:=1 to 4 do

      begin

       xx:=x+dx[e];yy:=y+dy[e];

       if(xx in[1..n])and(yy in[1..m])and

         (a[xx,yy]>a[x,y])and(dfs(xx,yy)+1>f[x,y])then

         f[x,y]:=dfs(xx,yy)+1;

      end;

      exit(f[x,y]);

    end;

    begin

      readln(n,m);

      for i:=1 to n do

      begin

       for j:=1 to m do

       read(a);

       readln;

      end;

      max:=0;

      for i:=1 to n do

       for j:=1 to m do

       begin

        s:=dfs(i,j);

        if s>max then max:=s;

       end;

     writeln(max);

    end.

  • 0
    @ 2012-10-19 09:07:53

    解析 + 代码 + 注释,完整题解传送门:

    http://user.qzone.qq.com/1304445713/blog/1350608530

    空间不设访问权限,没有动画,点开即看。代码有高亮有缩进

  • 0
    @ 2012-08-01 20:38:41

    水得很,模拟一遍就行了

    按高度快排,然后从高到低过一遍,最后找到最长的那个点

    代码就不贴出来丢人了……

    编译通过... 

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

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

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

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

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

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

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

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

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

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

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

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

  • 0
    @ 2012-07-30 08:47:50

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    #include

    #include

    #include

    #define maxn 501

    using namespace std;

    int R,C,ans=0;

    int a[maxn][maxn],f[maxn][maxn];

    struct jj{

    int x,y,num;

    }b[maxn*maxn];

    void qsort( int i,int j)

    {

    int l=i,r=j,k;

    k=b[(i+j)/2].num;

    while(l

  • 0
    @ 2012-07-17 15:21:19

    记忆化搜索就行了。。只需要在a[j']>a[i][j]的时候转移状态就可以了。。然后对每一个(i,j)都搜索一遍。。

    当然。。这种带环DP也可以用循环DP做。。就是一直用现在的最优值刷新当前状态直到所有状态不改变。。不过时间效率会比较低。。

  • 0
    @ 2010-07-08 10:02:13

    为什么会出现(17,12)error:Illegal qualifier;

    program t_1011;

    const xx:array[1..4]of -1..1=(1,0,-1,0);

    yy:array[1..4]of -1..1=(0,-1,0,1);

    var i,j,x,mid,n,m:integer;

    k:1..4;

    a,b,c:array[1..250000]of integer;

    f,map:array[1..500,1..500]of integer;

    procedure try(f,b:integer);

    var i,j:integer;

    begin

    i:=f; j:=b; mid:=a[(f+b)div 2];

    repeat

    while a[i]mid do j:=j-1;

    if ij;

    if fi then try(i,b);

    end;

    function ff(i,j:integer):integer;

    begin

    ff:=0;

    for k:=1 to 4 do

    if f[i+xx[k],j+yy[k]]>ff then ff:=f[i+xx[k],j+yy[k]];

    end;

    begin

    readln(n,m);

    for i:=1 to n do

    for j:=1 to m do begin

    read(map);

    x:=i*m-m+j;

    a[x]:=map;

    b[x]:=i; c[x]:=j;end;

    try(1,n*m);

    i:=n*m; f[b[i],c[i]]:=1;

    while i>=1 do begin

    i:=i-1;

    f[b[i],c[i]]:=ff(b[i],c[i])+1;

    end;

    end.

  • 0
    @ 2010-07-07 23:04:03

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    program vj1011;

    const

    maxn=510;

    dx:array[1..4] of longint=(-1,0,1,0);

    dy:array[1..4] of longint=(0,1,0,-1);

    var

    f,g:array[-2..maxn,-2..maxn] of longint;

    queue:array[-1..maxn*maxn,1..3] of longint;

    n,m:longint;

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

    begin

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

    end;

    procedure qksort(l,r:longint);

    var

    i,j,x:longint;

    t:array[1..3] of longint;

    begin

    i:=l;

    j:=r;

    x:=queue[(i+j) div 2,3];

    repeat

    while queue>x do inc(i);

    while queue[j,3]

  • 0
    @ 2010-07-04 14:24:17

    #include

    using namespace std;

    const int move[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

    int f[501][501],map[501][501],r,c,i,j;

    int dfs(int x,int y)

    {

    int xx,yy,temp;

    if (f[x][y]) return f[x][y];

    f[x][y]=1;

    for (int i=0;i

  • 0
    @ 2010-04-14 14:51:33

    编译通过...

    ├ 测试数据 01:果然没对... 0ms

    ├ 测试数据 02:终于错了... 0ms

    ├ 测试数据 03:诅咒成功... 0ms

    ├ 测试数据 04:遭遇250了... 0ms

    ├ 测试数据 05:蒙对一个... 0ms

    ├ 测试数据 06:碰到瞎猫... 0ms

    ├ 测试数据 07:碰到老鼠... 0ms

    ├ 测试数据 08:绝对错误... 0ms

    ├ 测试数据 09:答案超时... 0ms

    ├ 测试数据 10:答案不对... 0ms

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

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

  • 0
    @ 2010-04-09 20:55:12

    一定要用longint,不用担心超内存,第九组太诡异了

    通过率啊~~~~~~~~~~

  • 0
    @ 2010-04-09 19:30:06

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

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

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

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

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

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

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

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

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

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

    如有雷同,纯属巧合。。。。。。

  • 0
    @ 2010-04-07 22:15:54

    为何我狂报255?

  • 0
    @ 2010-03-28 14:06:01

    const

    dx:array[1..4]of shortint=(-1,0,1,0);

    dy:array[1..4]of shortint=(0,1,0,-1);

    var

    h,l,i,j,max:longint;

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

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

    var

    t1,t2,i,x1,y1:longint;

    begin

    if b[x,y]>0 then begin try:=b[x,y]; exit; end;

    t1:=1;

    for i:=1 to 4 do

    begin

    x1:=x+dx[i]; y1:=y+dy[i];

    if (x1>=1) and (x1=1)and (y1a[x,y])

    then begin

    t2:=try(x1,y1)+1;

    if t2>t1 then t1:=t2;

    end;

    end;

    b[x,y]:=t1; try:=t1;

    end;

    begin

    readln(h,l); max:=0;

    for i:=1 to h do

    for j:=1 to l do

    begin

    read(a);

    b:=0;

    end;

    for i:=1 to h do

    for j:=1 to l do

    begin

    b:=try(i,j);

    if b>max then max:=b;

    end;

    writeln(max);

    end.

    哪位大侠帮我看看哪里错了!!

  • 0
    @ 2010-03-16 23:00:20

    const

    xx:array[1..4]of integer=(1,0,-1,0);

    yy:array[1..4]of integer=(0,1,0,-1);

    var

    map:array[0..1001,0..1001]of longint;

    i,j,r,c:longint;

    vis:array[0..1001,0..1001]of longint;

    max:longint;

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

    var

    k:longint;

    begin

    if vis[x,y]>=0 then exit(vis[x,y]);

    vis[x,y]:=1;

    for k:=1 to 4 do

    if map[x+xx[k],y+yy[k]]>map[x,y] then

    if find(x+xx[k],y+yy[k])+1>vis[x,y] then vis[x,y]:=find(x+xx[k],y+yy[k])+1;

    exit(vis[x,y]);

    end;

    begin

    readln(r,c);

    for i:=1 to r do begin

    for j:=1 to c do begin

    read(map);

    vis:=-1;

    end;

    readln;

    end;

    for i:=0 to r+1 do begin

    vis:=0;

    vis:=0;

    end;

    for i:=0 to c+1 do begin

    vis[0,i]:=0;

    vis[r+1,i]:=0;

    end;

    max:=0;

    for i:=1 to r do

    for j:=1 to c do

    if find(i,j)>max then max:=find(i,j);

    writeln(max);

    end.

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

    编译通过...

    ├ 测试数据 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-11-10 09:12:29

    记忆化搜索。。

    const dx:array[1..4] of integer=(0,1,0,-1);

    dy:array[1..4] of integer=(1,0,-1,0);

    var r,c,ms:longint;

    a,f:array[0..501,0..501] of longint;

    procedure reed;

    var i,j:longint;

    begin

    readln(r,c);

    fillchar(a,sizeof(a),$ff);

    for i:=1 to r do

    begin

    for j:=1 to c do

    read(a);

    readln;

    end;

    for i:=1 to r do

    for j:=1 to c do f:=1;

    end;

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

    var x,y,k:longint;

    begin

    if f1 then exit(f);

    if (a[i+dx[1],j+dy[1]]>a) and (a[i+dx[2],j+dy[2]]>a) and

    (a[i+dx[3],j+dy[3]]>a) and (a[i+dx[4],j+dy[4]]>a)

    then exit(1);

    for k:=1 to 4 do

    begin

    x:=i+dx[k];y:=j+dy[k];

    if (a[x,y]

  • 0
    @ 2009-11-09 22:40:16

    编译通过...

    ├ 测试数据 01:答案错误...程序输出比正确答案长

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

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

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

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

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

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

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

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

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

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

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

    ....第一个点到底是什么~~为什么过不了..帮忙看看那错了~~

    Program t1;

    const dj:array [1..4] of -1..1=(-1,0,1,0);

    di:array [1..4] of -1..1=(0,1,0,-1);

    Var f,a:array [0..500,0..500]of longint;

    w:array [1..3,1..250000] of longint;

    sum,i,j,r,c,t:longint;

    flag:boolean;

    Procedure qsort(l,n:longint);

    Var i,j,x,t:longint;

    begin

    i:=l; j:=n; x:=w[1,(i+j) div 2];

    repeat

    while w[1,i]>x do inc(i);

    while w[1,j]sum then sum:=f[w[2,i],w[3,i]];

    end;

    Writeln(sum);

    end.

信息

ID
1011
难度
6
分类
动态规划 点击显示
标签
递交数
10384
已通过
2952
通过率
28%
被复制
29
上传者