题意:

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

思路:

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

然后就是这样。。。。

  1. 1 0 1 0
  2. 0 1 0 1
  3. 1 0 1 0
  4. 0 1 0 1

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

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

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

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. const int INF=1e4+10;
  6. const int N=1e2+10;
  7. int ma[N][N];
  8. int main()
  9. {
  10. int n,m,sum;
  11. int tmin;
  12. int i,j;
  13. int x,y;
  14. while(~scanf("%d%d",&n,&m))
  15. {
  16. tmin=INF;
  17. sum=0;
  18. for(i=1; i<=n; i++)
  19. {
  20. for(j=1; j<=m; j++)
  21. {
  22. scanf("%d",&ma[i][j]);
  23. sum+=ma[i][j];
  24. if(m%2==0 && n%2==0)
  25. {
  26. if(i%2==0 && j%2!=0)
  27. {
  28. if(ma[i][j]<tmin)
  29. {
  30. tmin=ma[i][j];
  31. x=i;
  32. y=j;
  33. }
  34. }
  35. if(i%2!=0 && j%2==0)
  36. {
  37. if(ma[i][j]<tmin)
  38. {
  39. tmin=ma[i][j];
  40. x=i;
  41. y=j;
  42. }
  43. }
  44. }
  45. }
  46. }
  47. if(n%2!=0)
  48. {
  49. printf("%d\n",sum);
  50. for(i=1; i<=n; i++)
  51. {
  52. if(i%2!=0)
  53. {
  54. for(j=1; j<=m-1; j++)
  55. printf("R");
  56. }
  57. if(i%2==0)
  58. {
  59. for(j=1; j<=m-1; j++)
  60. printf("L");
  61. }
  62. if(i==n && j==m)
  63. break;
  64. else
  65. printf("D");
  66. }
  67. }
  68. else if(m%2!=0)
  69. {
  70. printf("%d\n",sum);
  71. for(i=1; i<=m; i++)
  72. {
  73. if(i%2!=0)
  74. {
  75. for(j=1; j<=n-1; j++)
  76. printf("D");
  77. }
  78. if(i%2==0)
  79. {
  80. for(j=1; j<=n-1; j++)
  81. printf("U");
  82. }
  83. if(i==m && j==n)
  84. break;
  85. else
  86. printf("R");
  87. }
  88. }
  89. else
  90. {
  91. printf("%d\n",sum-tmin);
  92. for(i=1; i<=n; i+=2)
  93. {
  94. if(x==i || x==i+1)
  95. {
  96. //上下
  97. for(j=1; j<y; j++)
  98. {
  99. if(j%2!=0)
  100. printf("D");
  101. else
  102. printf("U");
  103. printf("R");
  104. }
  105. if(y<m)
  106. printf("R");
  107. //上下
  108. for(j=y+1; j<=m; j++)
  109. {
  110. if(j%2!=0)
  111. printf("U");
  112. else
  113. printf("D");
  114. if(j<m)
  115. printf("R");
  116. }
  117. if(i<n-1)
  118. printf("D");
  119. }
  120. else if(x<i)//左下右
  121. {
  122. for(j=1; j<m; j++)
  123. printf("L");
  124. printf("D");
  125. for(j=1; j<m; j++)
  126. printf("R");
  127. if(i<n-1)
  128. printf("D");
  129. }
  130. else//右下左
  131. {
  132. for(j=1; j<m; j++)
  133. printf("R");
  134. printf("D");
  135. for(j=1; j<m; j++)
  136. printf("L");
  137. printf("D");
  138. }
  139. }
  140. }
  141. printf("\n");
  142. }
  143. return 0;
  144. }
  145. /*
  146. 4 4
  147. 5 5 5 5
  148. 1 5 5 5
  149. 5 5 5 5
  150. 5 5 5 5
  151. 4 4
  152. 5 1 5 5
  153. 5 5 5 5
  154. 5 5 5 5
  155. 5 5 5 5
  156. */

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. (C++ STL)list的实现

    #include <iostream> using namespace std; //採用迭代器和空间配置器所实现的双向链表的基本功能 template<class _Ty,clas ...

  2. 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)

    十六进制数相等的推断 请问例如以下程序的输出是神马? #include <iostream> #include <string> using namespace std; in ...

  3. Yii 清理缓存

    html: <button onclick="clearCache()">ClearCache</button> js: function clearCac ...

  4. Ubuntu安装教程--Win7系统中含100M保留分区

    1.检查 Win7 保留分区 1)进入 Win7 打开库目录.在左側栏找到"计算机",瞄准点右键选择"管理"菜单: 2)在出来的管理面板左边找到"磁盘 ...

  5. Django-权限信息自定义标签

    自定义权限标签: import re from django.template import Library from django.conf import settings register = L ...

  6. Swift中字符串转化为Class的方法

    Swift中字符串转化为Class的方法 在开发中有时候会根据字符串进行对应类的转化,这样我们就可以动态根据服务器返回的字段,动态的加载类,比如优酷,微博等APP会在节假日等动态的TabBar.这样可 ...

  7. cocoapods导入框架出错 The dependency `FMDB` is not used in any concrete target

    问题描述: The dependency `FMDB` is not used in any concrete target 解决办法: 官网是这样给推荐的: 在创建Podfile的时候,用这种格式使 ...

  8. 设计模式学习笔记——State状态模式

    从一个类中,将有关状态的处理分离出来,独立成类,并面向接口编程.作用是可以简化代码,避免过多的条件判断:if-else-

  9. JVM手动分配内存(转载)

    原文内容很详细,不利于快速浏览,所以只保留了重点 原文地址 http://blog.csdn.net/mr__fang/article/details/47723767 内存检测工具jvisualVM ...

  10. jvm 命令

    jps  jps主要用来输出JVM中运行的进程状态信息.语法格式如下: jps [options] [hostid] 如果不指定hostid就默认为当前主机或服务器. -q 不输出类名.Jar名和传入 ...