【推导】【构造】Petrozavodsk Summer Training Camp 2015 Day 2: Xudyh (TooSimple) Contest, Saturday, August 22...

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

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

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

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

#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\n",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\n",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\n",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;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/7376641.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值