题目描述

一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少。

输入输出格式

输入格式:

输入第1行有一个正整数T,表示了有T组数据。

对于每一组数据,第1行有两个正整数N和M,表示了数字矩阵为N行M列。

接下来N行,每行M个非负整数,描述了这个数字矩阵。

输出格式:

输出包含T行,每行一个非负整数,输出所求得的答案。

输入输出样例

输入样例#1:

  1. 3
  2. 4 4
  3. 67 75 63 10
  4. 29 29 92 14
  5. 21 68 71 56
  6. 8 67 91 25
  7. 2 3
  8. 87 70 85
  9. 10 3 17
  10. 3 3
  11. 1 1 1
  12. 1 99 1
  13. 1 1 1
输出样例#1:

  1. 271
  2. 172
  3. 99

说明

对于第1组数据,取数方式如下:

[67] 75 63 10

29 29 [92] 14

[21] 68 71 56

8 67 [91] 25

对于20%的数据,N, M≤3;

对于40%的数据,N, M≤4;

对于60%的数据,N, M≤5;

对于100%的数据,N, M≤6,T≤20。

————————————————我是分割线————————————————————

  1. /*
  2. Problem:
  3. OJ:
  4. User: S.B.S.
  5. Time:
  6. Memory:
  7. Length:
  8. */
  9. #include<iostream>
  10. #include<cstdio>
  11. #include<cstring>
  12. #include<cmath>
  13. #include<algorithm>
  14. #include<queue>
  15. #include<cstdlib>
  16. #include<iomanip>
  17. #include<cassert>
  18. #include<climits>
  19. #include<functional>
  20. #include<bitset>
  21. #include<vector>
  22. #include<list>
  23. #define F(i,j,k) for(int i=j;i<=k;++i)
  24. #define M(a,b) memset(a,b,sizeof(a))
  25. #define FF(i,j,k) for(int i=j;i>=k;i--)
  26. #define maxn 10001
  27. #define inf 0x3f3f3f3f
  28. #define maxm 4001
  29. #define mod 998244353
  30. //#define LOCAL
  31. using namespace std;
  32. int read(){
  33. int x=,f=;char ch=getchar();
  34. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  35. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  36. return x*f;
  37. }
  38. int n,m;
  39. int ans;
  40. int a[][];
  41. int dx[]={,,,,,,-,-,-},dy[]={,,-,,-,,,,-};//方向增量
  42. int can[][];//表示是否可选
  43. void DFS(int i,int j,int now){//i为行,j为列,now为现值
  44. if(j>m){//列超出,行+1,列归1
  45. i++;
  46. j=;
  47. }
  48. if(i>n){//行超出,更新ans,结束
  49. if(now>ans)ans=now;
  50. return;
  51. }
  52. int k;
  53. if(can[i][j]==){//选
  54. for(k=;k<;k++)can[i+dx[k]][j+dy[k]]++;/*此次不能用bool存储,可能有多重状态*/
  55. DFS(i,j+,now+a[i][j]);
  56. for(k=;k<;k++)can[i+dx[k]][j+dy[k]]--;
  57. }
  58. DFS(i,j+,now);//不选
  59. }
  60. int main(){
  61. int t,i,j;
  62. scanf("%d",&t);
  63. while(t--){
  64. scanf("%d%d",&n,&m);
  65. ans=;
  66. for(i=;i<=n;i++){
  67. for(j=;j<=m;j++)scanf("%d",&a[i][j]);
  68. }
  69. memset(can,,sizeof(can));
  70. DFS(,,);
  71. printf("%d\n",ans);
  72. }
  73. return ;
  74. }

洛谷 P1123 取数游戏的更多相关文章

  1. 洛谷——P1123 取数游戏

    P1123 取数游戏 题目描述 一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取 ...

  2. 洛谷 p1123 取数游戏【dfs】

    题目链接:https://www.luogu.org/problemnew/show/P1123 转载于:>>>>>> 题目描述 一个N×M的由非负整数构成的数字矩 ...

  3. 洛谷P1123取数游戏题解

    题目 这是一道简单的搜索题,考查的还是比较基础的东西,其时搜索有时候并不难写,主要是要想到怎么搜.比如这个题,如果想二维四个方向搜则没有头绪,反之因为搜索是用递归实现的,所以我们可以使用递归的特性,把 ...

  4. 洛谷P1288 取数游戏II(博弈)

    洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...

  5. 洛谷P1288 取数游戏II[博弈论]

    题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...

  6. 洛谷P1288 取数游戏II

    题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...

  7. 洛谷1288 取数游戏II

    原题链接 因为保证有\(0\)权边,所以整个游戏实际上就是两条链. 很容易发现当先手距离\(0\)权边有奇数条边,那么必胜. 策略为:每次都将边上权值取光,逼迫后手向\(0\)权边靠拢.若此时后手不取 ...

  8. 洛谷P1288 取数游戏II 题解 博弈论

    题目链接:https://www.luogu.org/problem/P1288 首先,如果你的一边的边是 \(0\) ,那么你肯定走另一边. 那么你走另一边绝对不能让这条边有剩余,因为这条边有剩余的 ...

  9. 洛谷 P1288 取数游戏II

    奇奇怪怪的游戏,不多写了 #include<cstdio> ]; int main() { int i; scanf("%d",&n); ;i<=n;i+ ...

随机推荐

  1. shared_ptr(作为局部变量返回)

    智能指针:shared_ptr 1.一个局部的shared_ptr 作为返回值过程:当shared_ptr 被创建的时候,自身的引用计数 +1,当前引用计数为 1 , 按值返回以后 引用计数 + 1 ...

  2. gi常用命令

    git提交代码流程 git status 检查当前代码和主支代码不同的状态 git diff 可指定文件查看这个文件修改的内容 git add . 把自己所有修改的代码提交 git commit 提交 ...

  3. Javascript数组Array的方法总结!

    1.join() 将数组的元素组成一个字符串,以分隔符连接,如果省略则默认逗号为分隔符,该方法只接收一个参数:分隔符.此方法不会改变原数组. let arr = [1,2,3,4] let arr1 ...

  4. python删除执行路径下的空文件夹

    def rm_emp_dir(path): """ 删除指定路径下的空文件夹 :param path: 指定路径 :type path: str :return: Non ...

  5. 使用HttpServlet简单实例

    使用HttpServlet简单实例 package com.kettas.servlet ; import javax.servlet.* ; import javax.servlet.http.* ...

  6. flask run方法和run_simple

    1.Flask提供的Web服务器不适合在生产环境中使用 2.run方法启动flask集成的服务器: 例: if __name__ == '__main__': app.run(debug=True) ...

  7. jvm 参数配置优化

    abtest业务线上接口每分钟执行3万多次,到半夜1点多访问量小的时候会经常报内存占比过高, 经调研分析发现与白天访问量高时线程数.cpu等无太大差异,主要差异存在内存会涨到很高并持续 一段时间. 现 ...

  8. BZOJ.4695.最假女选手(线段树 Segment tree Beats!)

    题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时 ...

  9. (android高仿系列)今日头条 --新闻阅读器 (转载)

    非常不错,原文地址:http://blog.csdn.net/vipzjyno1/article/details/26514543

  10. Hystrix简单介绍

    Netflix的Hystrix是一个帮助解决分布式系统交互超时处理和容错的类库,同样拥有保护系统的能力. 服务隔离 服务降级 1.服务隔离 在一个系统中,一个业务通常会依赖多个服务,且这若干个服务的调 ...