zoukankan      html  css  js  c++  java
  • 【推导】【构造】Petrozavodsk Summer Training Camp 2015 Day 2: Xudyh (TooSimple) Contest, Saturday, August 22, 2015 Problem G. Travelling Salesman Problem

    一个矩阵,每个位置有一个非负整数,一个人从左上走到右下,不能走重复的格子,问得到的最大权值。

    当长宽不都为偶数时,必然能走遍所有格子,横着从左到右,从右到左(或是竖着走)走完即可。

    当长宽都是偶数时,必然只有一个格子走不到,黑白染色后,就是白色格子中的最小值走不到,别的全都可以走得到。

    两行两行地走,如果没到不取的那个格子所在的那两行,那就横着从左到右,从右到左;如果到了这两行,就竖着循环走;过了这两行之后,就横着从右到左,从左到右。

    #include<cstdio>
    using namespace std;
    bool co[105][105];
    int n,m,a[105][105],T;
    int main(){
    //	freopen("g.in","r",stdin);
    	scanf("%d",&T);
    	a[0][0]=2147483647;
    	for(;T;--T){
    		scanf("%d%d",&n,&m);
    		int sum=0;
    		for(int i=1;i<=n;++i){
    			for(int j=1;j<=m;++j){
    				scanf("%d",&a[i][j]);
    				sum+=a[i][j];
    			}
    		}
    		if(n%2==1){
    			printf("%d
    ",sum);
    			for(int i=1;i<=n;++i){
    				for(int j=1;j<m;++j){
    					putchar(i%2==1 ? 'R' : 'L');
    				}
    				if(i!=n){
    					putchar('D');
    				}
    			}
    			puts("");
    		}
    		else if(n%2==0 && m%2==1){
    			printf("%d
    ",sum);
    			for(int i=1;i<=m;++i){
    				for(int j=1;j<n;++j){
    					putchar(i%2==1 ? 'D' : 'U');
    				}
    				if(i!=m){
    					putchar('R');
    				}
    			}
    			puts("");
    		}
    		else{
    			for(int i=1;i<=n;++i){
    				bool pen=(i%2==1);
    				for(int j=1;j<=m;++j){
    					co[i][j]=pen;
    					pen^=1;
    				}
    			}
    			int x=0,y=0;
    			for(int i=1;i<=n;++i){
    				for(int j=1;j<=m;++j){
    					if(co[i][j]==0 && a[i][j]<a[x][y]){
    						x=i;
    						y=j;
    					}
    				}
    			}
    			sum-=a[x][y];
    			printf("%d
    ",sum);
    			bool flag=0;
    			for(int i=1;i<=n;i+=2){
    				if(!flag && (i==x || i+1==x)){
    					bool tag=0;
    					for(int j=1;j<=m;++j){
    						if(j!=y){
    							putchar(tag==0 ? 'D' : 'U');
    							tag^=1;
    						}
    						if(j!=m){
    							putchar('R');
    						}
    					}
    					flag=1;
    				}
    				else if(!flag){
    					for(int j=1;j<m;++j){
    						putchar('R');
    					}
    					putchar('D');
    					for(int j=1;j<m;++j){
    						putchar('L');
    					}
    				}
    				else{
    					for(int j=1;j<m;++j){
    						putchar('L');
    					}
    					putchar('D');
    					for(int j=1;j<m;++j){
    						putchar('R');
    					}
    				}
    				if(i!=n-1){
    					putchar('D');
    				}
    			}
    			puts("");
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    解决Enterprise Library January 2006不能加密配置文件的方法
    ASP.NET Ajax 和ASP.NET 2.0 的登陆控件相冲突的问题的讨论
    十二时辰与时间对照表,十二经络时辰表
    对表中数据逐行累加
    SQL脚本 CASE...WHEN...THEN...ELSE...END 的应用
    [转]看刚毕业MM如何在北京买房
    让你的GUI程序随WINDOWS服务一起启动
    启动Oracle,SQL服务,IIS脚本
    无论买新房还是二手房 教你六招可放心收房
    经典开源项目简介及源码下载
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7376641.html
Copyright © 2011-2022 走看看