358 条题解
-
0FCB_NO1 LV 8 @ 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;
} -
02013-02-16 10:10:59@
-
02012-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了……
提醒人们不要粘标程!注意改过的数据范围! -
02012-10-30 07:53:47@
快排。存坐标。用坐标存线性表中的序号。每次看他在矩阵中可以到的点是否在他线性表中位置的后面。然后DP。。
-
02012-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. -
02012-10-19 09:07:53@
解析 + 代码 + 注释,完整题解传送门:
http://user.qzone.qq.com/1304445713/blog/1350608530
空间不设访问权限,没有动画,点开即看。代码有高亮有缩进 -
02012-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 -
02012-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 -
02012-07-17 15:21:19@
记忆化搜索就行了。。只需要在a[j']>a[i][j]的时候转移状态就可以了。。然后对每一个(i,j)都搜索一遍。。
当然。。这种带环DP也可以用循环DP做。。就是一直用现在的最优值刷新当前状态直到所有状态不改变。。不过时间效率会比较低。。
-
02010-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. -
02010-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 有效耗时:75msprogram 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] -
02010-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 -
02010-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 -
02010-04-09 20:55:12@
一定要用longint,不用担心超内存,第九组太诡异了
通过率啊~~~~~~~~~~ -
02010-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
如有雷同,纯属巧合。。。。。。 -
02010-04-07 22:15:54@
为何我狂报255?
-
02010-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.
哪位大侠帮我看看哪里错了!! -
02010-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 -
02009-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;
beginif 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] -
02009-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.