题意:

给你一个矩阵,每个值都是非负,然后让你从左上角走到右下角,每个点只能走一次,求到终点的最大值,还要输出一条路径

思路:

一开始拿到还以为搜索之类的,但是发现神特么暴力+麻烦(因为路径这个东西。。。),虽然路径现在也是能写,但是开个数组。。。还是嫌麻烦。题意给出的非负的,而且如果矩阵的行或列是奇数的时候就一定能走完,具体走法,还是具体实现就好了。但是偶行偶列不行,后来想了一个是不是全部值-一个最小。。。随便举个反例就会知道,这个存在最小的绕不过去,还得搭上旁边的几个,所以才有了正确的解法,我们先去找那些能绕过去的位置,也就是饶过他,我可以通过其他的点走到右下角。

然后就是这样。。。。

1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1

0表示可以绕过去,也就是除了他我可以走完。

那么就在能绕过去那边找一个最小的,为什么这样就是对的呢,如果我绕过的是不能除了他就走完的位置的话,那势必会减少至少一个旁边的位置,所以我去找最小可以绕过的位置,然后饶过他,就是正确的方法。

然后我们只要去判断这个最小在哪一行就好了,最好就是两行,因为从起点出去,那个点在0位置的话,我们可以选定两行发现是一定满足从左上进,右下出,那么在这个两行前面的行我们就是右 下 左 再下,两行下面的行就是左 下 右 ,看情况再下,就是这样。。。

说的不好,但是代码还是很清楚的。。。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; const int INF=1e4+10;
const int N=1e2+10;
int ma[N][N]; int main()
{
int n,m,sum;
int tmin;
int i,j;
int x,y;
while(~scanf("%d%d",&n,&m))
{
tmin=INF;
sum=0;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
scanf("%d",&ma[i][j]);
sum+=ma[i][j];
if(m%2==0 && n%2==0)
{
if(i%2==0 && j%2!=0)
{
if(ma[i][j]<tmin)
{
tmin=ma[i][j];
x=i;
y=j;
}
}
if(i%2!=0 && j%2==0)
{
if(ma[i][j]<tmin)
{
tmin=ma[i][j];
x=i;
y=j;
}
}
}
}
}
if(n%2!=0)
{
printf("%d\n",sum);
for(i=1; i<=n; i++)
{
if(i%2!=0)
{
for(j=1; j<=m-1; j++)
printf("R");
}
if(i%2==0)
{
for(j=1; j<=m-1; j++)
printf("L");
}
if(i==n && j==m)
break;
else
printf("D");
}
}
else if(m%2!=0)
{
printf("%d\n",sum);
for(i=1; i<=m; i++)
{
if(i%2!=0)
{
for(j=1; j<=n-1; j++)
printf("D");
}
if(i%2==0)
{
for(j=1; j<=n-1; j++)
printf("U");
}
if(i==m && j==n)
break;
else
printf("R");
}
}
else
{
printf("%d\n",sum-tmin); for(i=1; i<=n; i+=2)
{
if(x==i || x==i+1)
{
//上下
for(j=1; j<y; j++)
{
if(j%2!=0)
printf("D");
else
printf("U"); printf("R");
} if(y<m)
printf("R"); //上下
for(j=y+1; j<=m; j++)
{
if(j%2!=0)
printf("U");
else
printf("D");
if(j<m)
printf("R");
}
if(i<n-1)
printf("D");
}
else if(x<i)//左下右
{
for(j=1; j<m; j++)
printf("L");
printf("D");
for(j=1; j<m; j++)
printf("R"); if(i<n-1)
printf("D");
}
else//右下左
{
for(j=1; j<m; j++)
printf("R");
printf("D");
for(j=1; j<m; j++)
printf("L"); printf("D");
}
}
}
printf("\n");
}
return 0;
} /* 4 4
5 5 5 5
1 5 5 5
5 5 5 5
5 5 5 5 4 4
5 1 5 5
5 5 5 5
5 5 5 5
5 5 5 5 */

hdoj5402 【模拟/构造】的更多相关文章

  1. 学习xss模拟构造攻击(第一篇)

    本文作者:i春秋签约作家——rosectow 0×00前言 XSS又名叫CSS全程(cross site scriptting),中文名跨站脚本攻击,目前网站的常见漏洞之一,它的危害没有像上传漏洞,s ...

  2. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A B C D 水 模拟 构造

    A. Neverending competitions time limit per test 2 seconds memory limit per test 512 megabytes input ...

  3. Codeforces Round #350 (Div. 2) F. Restore a Number 模拟构造题

    F. Restore a Number   Vasya decided to pass a very large integer n to Kate. First, he wrote that num ...

  4. Codeforces 791C. Bear and Different Names 模拟构造

    C. Bear and Different Names time limit per test:1 second memory limit per test:256 megabytes input:s ...

  5. HDU 5402 模拟 构造 Travelling Salesman Problem

    题意: 有一个n * m的数字矩阵,每个格子放着一个非负整数,从左上角走到右下角,每个格子最多走一次,问所经过的格子的最大权值之和是多少,并且输出一个路径. 分析: 如果n和m有一个是偶数的话,那么只 ...

  6. Codeforces 174B【模拟构造】

    题意: 给你一个串只有小写字母和点,让你构造前缀是1-8,后缀是1-3长度的文件名: 思路: 那么以"."作为分割点,把字符串都拿出来,然后 首段长度<=8 OK; 中间&l ...

  7. [CSP-S模拟测试]:骆驼(模拟+构造)

    题目描述 我们都熟悉走马步,现在我们定义一种新的移动方式——骆驼步,它在一个国际棋盘上的移动规则是这样的. 以看出,骆驼步可以向八个方向走动,且不能走出棋盘范围. 现在给出一个$N\times N$的 ...

  8. Dreamoon Likes Coloring(模拟+构造)

    \(这题刚好撞到我的思路了,但是因为模拟......我看了几十遍测试数据....\) $首先当\sum_^m$小于n时一定无解 大于呢?那我们就要浪费一些区间(覆盖一些点,也就是多出来的点) 但是又不 ...

  9. CF733C Epidemic in Monstropolis[模拟 构造 贪心]

    C. Epidemic in Monstropolis time limit per test 1 second memory limit per test 256 megabytes input s ...

随机推荐

  1. row and col

    1.行 <Row gutter={{ md: 6, lg: 12, xl: 12 }}></Row> gutter: md: 中等屏幕 桌面显示器 (≥992px) lg: 大 ...

  2. android-problem——remount of /system failed: Read-only file system

    adb remount后仍旧不能对system进行读写.需要进行adb disable-verity 在Android6.0 (Android M)userdebug版本上(eng版本不存在该问题), ...

  3. Android中View的事件分发机制——Android开发艺术探索笔记

    原文链接 http://sparkyuan.me/ 转载请注明出处 介绍 点击事件的事件分发就是对MotionEvent事件的分发过程.当一个MotionEvent产生了以后,系统须要把这个事件传递给 ...

  4. TinyXML:属性

    TiXmlAttribute: 代表XML中的属性,TiXmlAttribute中定义了一系列对属性的操作 TiXmlAttribute的友元类: friend class TiXmlAttribut ...

  5. 使网页适应UIWebView的宽度

    比較简单的做法是:在- (void)webViewDidFinishLoad:这种方法中,改动JavaScript的值: //UIWebViewDelegate - (void)webViewDidF ...

  6. 【网络协议】IP协议、ARP协议、RARP协议

    IP数据报 IP是TCP/IP协议族中最核心的协议,全部的TCP.UDP.ICMP.IGMP数据都以IP数据报的格式传输.IP仅提供尽力而为的传输服务.假设发生某种错误.IP会丢失该数据.然后发送IC ...

  7. Java 线程池ThreadPoolExecutor简单应用

    什么是线程池: 线程池就是控制线程的一个池子.用来控制线程数量. 为什么要使用线程池: 1.避免系统反复创建和销毁线程影响执行的时间(创建+销毁>>执行时间时) 2.控制线程数量.线程过多 ...

  8. java的gradle项目的基本配置

    plugins { id 'org.springframework.boot' version '2.1.4.RELEASE' id 'java' } apply plugin: 'io.spring ...

  9. HDFS vs. MongoDB

    HDFS MongoDB 共同点 http://www.mongoing.com/wp-content/uploads/2016/08/MDBSH2016/TJ_MongoDB+Spark.pdf 横 ...

  10. Fibonacci数列(找规律)

    题目描述 Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, ...