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;
    }
  • 相关阅读:
    iOS-Core-Animation-Advanced-Techniques(一)
    一个很有借鉴价值的编程故事
    11
    安卓学习路线
    weakSelf和strongSelf
    <二>iOS 开发Push的个人见解 图文并茂 详细到我写的想吐!!!!!!!!!
    <一>iOS 开发Push的个人见解 图文并茂 详细到我写的想吐!!!!!!!!!
    啊哈!算法 学习2 排序
    啊哈!算法 学习1 排序
    转载---CGImageSource对图像数据读取任务的抽象
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7376641.html
Copyright © 2011-2022 走看看