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;
}

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




本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4646440.html,如需转载请自行联系原作者


相关文章
|
6月前
|
人工智能
HDU-1159-Common Subsequence
HDU-1159-Common Subsequence
33 0
|
6月前
poj-1458-Common Subsequence
poj-1458-Common Subsequence
30 0
|
6月前
Strange fuction(HDU--2899)
Strange fuction(HDU--2899)
|
人工智能 BI
UVA live 2678 - Subsequence
关于这个题目,有多种的解法,如果枚举起点和终点,时间复杂度为O(n^3),但如果我们用一个数组B把一段数的和存起来,B[i] = sum(a[1].....a[i])。这样就可以把时间复杂度降到O(n^2)。
69 0
POJ-1458,Common Subsequence(经典DP)
POJ-1458,Common Subsequence(经典DP)
[UVa OJ] Longest Common Subsequence
This is the classic LCS problem. Since it only requires you to print the maximum length, the code can be optimized to use only O(m) space (see here).
775 0