UVa 10285 - Longest Run on a Snowboard

称号:给你一个二维矩阵,找到一个点。每一个可以移动到的位置相邻的上下,求最长单调路径。

分析:贪婪,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;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

posted @ 2015-07-14 19:50  mfrbuaa  阅读(186)  评论(0编辑  收藏  举报