题目:给你一个二维的矩阵,找到一个点,每次可以移动到上下左右相邻的位置,求最长的单调路径。
分析:贪心,dp,搜索。这道题数据较小,怎么做都可以。
这里使用贪心算法:
首先,将所有点按照权值排序(每个点一定被值更大的点更新);
然后,按顺序更新排序后,每个点更新周围的点;
最后,找到最大值输出即可。
说明:╮(╯▽╰)╭竟然拍了1000+,还以为这种方法比较快呢(数据分布啊╮(╯▽╰)╭)。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef struct nodep
{
int value,x,y;
}point;
point now,Node[10004];
char buf[256];
int maps[102][102];
int imap[102][102];
int dmap[102][102];
int cmp1( point a, point b )
{
return a.value > b.value;
}
int cmp2( point a, point b )
{
return a.value < b.value;
}
int main()
{
int T,R,C,dxy[4][2] = {1,0,0,1,-1,0,0,-1};
while ( ~scanf("%d",&T) )
while ( T -- ) {
scanf("%s%d%d",buf,&R,&C);
int count = 0;
for ( int i = 1 ; i <= R ; ++ i )
for ( int j = 1 ; j <= C ; ++ j ) {
scanf("%d",&maps[i][j]);
imap[i][j] = dmap[i][j] = 1;
Node[count].value = maps[i][j];
Node[count].x = i;
Node[count].y = j;
count ++;
}
sort( Node, Node+count, cmp1 );
for ( int i = 0 ; i < count ; ++ i ) {
for ( int j = 0 ; j < 4 ; ++ j ) {
now.x = Node[i].x+dxy[j][0];
now.y = Node[i].y+dxy[j][1];
if ( now.x >= 1 && now.x <= R && now.y >= 1 && now.y <= C ) {
if ( maps[now.x][now.y] < maps[Node[i].x][Node[i].y] )
if ( dmap[now.x][now.y] < dmap[Node[i].x][Node[i].y]+1 )
dmap[now.x][now.y] = dmap[Node[i].x][Node[i].y]+1;
}
}
}
sort( Node, Node+count, cmp1 );
for ( int i = 0 ; i < count ; ++ i ) {
for ( int j = 0 ; j < 4 ; ++ j ) {
now.x = Node[i].x+dxy[j][0];
now.y = Node[i].y+dxy[j][1];
if ( now.x >= 1 && now.x <= R && now.y >= 1 && now.y <= C ) {
if ( maps[now.x][now.y] > maps[Node[i].x][Node[i].y] )
if ( imap[now.x][now.y] < imap[Node[i].x][Node[i].y]+1 )
imap[now.x][now.y] = imap[Node[i].x][Node[i].y]+1;
}
}
}
int max = 0;
for ( int i = 1 ; i <= R ; ++ i )
for ( int j = 1 ; j <= C ; ++ j ) {
if ( max < imap[i][j] )
max = imap[i][j];
if ( max < dmap[i][j] )
max = dmap[i][j];
}
printf("%s: %d\n",buf,max);
}
return 0;
}
UVa 10285 - Longest Run on a Snowboard,布布扣,bubuko.com
UVa 10285 - Longest Run on a Snowboard
原文地址:http://blog.csdn.net/mobius_strip/article/details/38727641