hdu(5402)——Travelling Salesman Problem(模拟题)
来源:互联网 发布:淘宝网唯品会 编辑:程序博客网 时间:2024/05/29 18:33
啊。。。这道题我一开始的想法是dp,因为我们要求的是在这个区间中和的最大值。
但是没想到只要暴力就好了。
这道题用到了一个著名的想法是:黑白棋盘染色问题。
题意:
现在给你一个n*m的矩阵,然后告诉你每个矩阵中的数字,然后现在要从左上角走到右下角,然后问你所能获得的数字和的最大值是多少。当然,你只能往四个方向走,而且每个点只能走一次。并且叫你输出路径。
思路:
这里我分了三种情况。
1)首先当行或者列数都是1的时候,那么我们就只可能有一种走法(横着走或者是竖着走)然后获取所有的数值。
2)当行数或者是列数其中之一是奇数时,我们肯定能够遍历完这张地图的全部,走法要根据行列奇偶性然后来分情况讨论。
3)这种情况是这道题里面最复杂的一种了。。。我竟然卡了整整一个晚上,我的想法是把每一种情况都分出来,但是实际上不用。
http://blog.csdn.net/queuelovestack/article/details/47756605 (借鉴了这里的思路)
我们只需在白块中找到一个值最小的,然后不走就好了。
那么怎么绕过去呢?想法就是在走到这一行或是那个点的上一行时,用S型的姿势绕过去,相当于这样子是一下子就走了两行,注意一下绕过去之后的L与R的选择就好。
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<vector>using namespace std;#define maxn 111#define inf 99999999int a[maxn][maxn];int main(){int n,m;while(~scanf("%d%d",&n,&m)){memset(a,0,sizeof(a));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==1){printf("%d\n",sum);for(int i=1;i<m;i++) printf("R"); puts("");}else if(m==1){printf("%d\n",sum);for(int i=1;i<n;i++) printf("D"); puts("");}else if(n%2||m%2){printf("%d\n",sum);if(n%2){//列是偶数; for(int i=1;i<=n;i++){for(int j=1;j<m;j++){if(i%2){printf("R");}else printf("L");}if(i!=n) printf("D");}}else{//行是偶数; for(int i=1;i<=m;i++){for(int j=1;j<n;j++){if(i%2){ printf("D");}else printf("U");}if(i!=m) printf("R");}}}//以上都是对的! else{int tx=0,ty=0;int ans=inf;//下面的目的是为了找到在白块中数值最小的那个点的坐标; for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(i%2){if(j%2==0){if(ans>a[i][j]){ans=a[i][j];tx=i; ty=j;}}}else if(i%2==0){if(j%2){if(ans>a[i][j]){ans=a[i][j];tx=i; ty=j;}}}}}printf("%d\n",sum-ans);//printf("%d %d\n",tx,ty);for(int i=1;i<=n;i+=2){if(i==tx||i+1==tx){for(int j=1;j<ty;j++){if(j&1) printf("D");else printf("U");printf("R");}if(ty<m) printf("R");for(int j=ty+1;j<=m;j++){if(j&1) printf("U");else printf("D");if(j<m) printf("R");}if(tx<n-1) printf("D");}else if(tx<i){for(int j=1;j<m;j++){printf("L");}printf("D");for(int j=1;j<m;j++){printf("R");}if(i<n-1) printf("D");}else{for(int j=1;j<m;j++){printf("R");}printf("D");for(int j=1;j<m;j++){printf("L");}printf("D");}}}printf("\n");}}
orz多校。。。
0 0
- hdu(5402)——Travelling Salesman Problem(模拟题)
- Travelling Salesman Problem (hdu 5402 模拟)
- HDU-5402 Travelling Salesman Problem(模拟)
- hdu 5402 Travelling Salesman Problem 模拟构造
- hdu 5402 Travelling Salesman Problem(构造+模拟)
- HDU 5402 Travelling Salesman Problem(多校9 模拟)
- HDU 5402 Travelling Salesman Problem (MUT#9 暴力模拟)
- hdu 5402 Travelling Salesman Problem(模拟,棋盘染色问题)
- 规律,模拟,贪心(Travelling Salesman Problem,HDU 5402)
- HDU 5402 (构造题)Travelling Salesman Problem
- 【HDU 5402】Travelling Salesman Problem(构造)
- hdu 5402 Travelling Salesman Problem(构造)
- HDU 5402 Travelling Salesman Problem (构造)(好题)
- HDU 5402 Travelling Salesman Problem
- HDU 5402 Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem
- c++ primer plus 第七章-编程题7.13.6《Fill_array,Show_array,Reverse_array》
- gitlab操作命令
- sshd源码下载与编译安装
- BMP位图信息·DIB结构
- git 代码协同之回车问题
- hdu(5402)——Travelling Salesman Problem(模拟题)
- common.io中Tailer类读取文件内容乱码问题解决
- Android基础入门教程——2.3.8 SeekBar(拖动条)
- Spring Cache 使用
- JAVA--Runtime类研究
- 用makefile编译生成.a文件(linux静态库),并编译进可执行文件中
- Linux运行脚本作为守护进程的各种方法
- Android设计模式系列-单例模式
- 工具的使用问题解决(eclipse)