• UVa 10285


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

    分析:贪婪,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
    ",buf,max);
    	}
    	return 0;
    }
    

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

  • 相关阅读:
    nginx实现请求的负载均衡 + Keep Alive实现nginx的高可用
    理解什么是JWT(Json web token)及Python实现
    TCP/UDP协议到底是什么
    Redis实现分布式单点登录
    Python面试题---给定一个字符串 {xxx[xxx{xxx}]xx{x[xxx]xxx{xxx}xx}x} 判断其中的 {}[]() 是否成对出现
    Typora里面如何快捷改变字体颜色?
    基于Docker安装关系型数据库PostgrelSQL替代Mysql
    PEP8-Python编码规范
    欢迎来到我的友链小屋
    windows下lib和dll区别
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4646440.html
Copyright © 2020-2023  润新知