题目描述

斌斌翻水水的家乡有很多个水井,每个水井 i 和其他水井 j 都有一个管子连通,这样一个水井没水的时候其他的水井可以通过水管直接输送水过来,而这个管子的容量是vij,
有一天斌斌翻水水在野外烧烤的时候被一个奇异的小石头砸中,当时斌斌翻水水就觉的这个石头很特别就带回了家,在多年的研究之下他发现这个石头有个神奇的功能:
它能够将多个水井划分成两个区域A和B,在同一个区域的水井之间不再需要水管连接,神奇的小石头可以直接让他们的水流通,但是在不同区域的水井却不行,仍然需要水管相连接。
本来正常人直接把所有水井都放到A或者B,这样所有水井都互通了,但是斌斌翻水水不一样,他觉的这些水管放着不用可惜,他想让水井之间用到的水管的容量总数最大(每一个水井不是在A区域就是在B区域
不能独立在外),但是斌斌翻水水又很懒不想自己去想怎么进行划分,所以他把这个难题抛给了聪明的你,希望你能帮住到他。

输入

输入一共N+1行,第一行为一个数字N(2 <= N <= 20),代表一共有几个水井,接下去有N行数字,每行数字有N个数字,第i行数字的第j列数字代表Vij.(注意 vij = vji , vii = 0, 0 <= vij <= 10000)(例如样例中的 0 50 30 的 50代表第一个水井和第二个水井之间的水管容量为50)

输出

一共一行,那一行包含一个数字,代表斌斌翻水水让你求的利用水管的最大容量总和。

样例输入

3
0 50 30
50 0 40
30 40 0

样例输出

90

提示

90的答案是这样来的,将第一个水井和第三个水井放在A,将第二个水井放到B,那么第一个水井和第三个水井和第二个水井之间的水管要连接那么便是50+40 = 90。
虽然神奇的石头拥有着超自然的力量,但是其他物质和现实生活中一样,所以你无需考虑水管容量是负数的情况,只需要考虑水管是非负数的情况就行了。

解题思路:

这个题比较考语文, vij表示的是代表管子容量的二维数组, 例如井1和井2之间管子的容量就是v[1][2]。在将井分配到A,B俩个区域之后, 他们之间的管子容量也就确定了下来。
例如A区域有井1和井2,B区域有着井3和井4,那么此时的容量就为 v[1][3] + v[1][4] + v[2][3] + v[2][4]。
输入中的第2行至第N+1行所输入的就是V这个代表管子容量的二维数组。

看懂了题目之后,我们来思考这个题该怎么写:

首先我们会想到使用dfs, 将所有情况都考虑到然后选出容量最大的那个。但是我第一遍这么做的时候失败了, 当时我的dfs仅仅只有一个参数, 就是我所遍历的井, 所以每执行一次都要用一个二重循环来算出当时的容量, 结果就是超时了。 所以这次的dfs将引入俩个变量, 第一个代表我遍历的井, 第二个代表之前的状态(之前有多少容量), 这样我们就可以减少时间复杂度。

大概做法就是:一开始就将所有的井都放在一个区域, 然后一个一个的往另一边拿一个井。废话不多说,现在上代码:

#include<iostream>
#include<algorithm>//dfs里用到了max函数
using namespace std;int n;
int pipe[40][40];
int vis[30];
int ans;void dfs(int x, int total)//total表示的是之前的总容量。
{if(x==n+1) return ;ans = max(ans, total);//如果找到更大的了,就更新ans。int num = total;//因为total这个状态还有用,可以换着水井往左边拿,引入num更加方便。vis[x] = 1;//拿到左边的水井需要标记。for(int i=1;i<=n;i++){if(vis[i]==0){num += pipe[x][i];//新拿到左边的水井会增加和右边水井的容量。}else {num -= pipe[x][i];//新拿到左边的水井和原本就在左边的水井之间的容量会消失,所以要剪掉。}}dfs(x+1, num);//开始继续从右边拿水井。vis[x]=0;dfs(x+1, total);//把拿过去的拿回来,换一个拿过去。
}int main()
{scanf("%d", &n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d", &pipe[i][j]);}}dfs(1,0);printf("%d", ans);return 0;}

神奇的小石子 dfs(深搜) 考核补题相关推荐

  1. 2020 年百度之星·程序设计大赛 - 初赛一 GPA DFS深搜

    problem GPA Accepts: 1554 Submissions: 3947 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...

  2. dfs深搜--八皇后问题

    题目描述 一个如下的 6×66 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用 ...

  3. [USACO13FEB]Perimeter【DFS / 深搜】

    Pro Luogu3072 Sol 这题的话,我就把我的想做当做反例给说一下. 错误想法:很容易的发现,一个不规则的图形,我们可以通过转换为规则的矩形来求周长,可以平移一些边来求得,但是存在反例. 如 ...

  4. [hihocoder] #1716 : 继承顺位(dfs深搜)

    时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 H国的国王有很多王子,这些王子各自也都有很多王孙,王孙又各自有很多后代-- 总之,H国王族的族谱形成了一棵以国王为根 ...

  5. 部分和(dfs深搜回溯法)

    问题描述 给定整数序列a1,a2,.,an,判断是否可以从中选出若干数,使它们的和恰好为k, 1<=n<=20 -10^8<=ai<=10^8 -10^8<=k<= ...

  6. 数独游戏(dfs深搜)

    问题描述 如下所示,玩家需要根据9*9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个色九宫内的数字均含1-9,不重复 数独的答案都是唯一的,所以,多个解也称为无解 本图的数字 ...

  7. 【DFS深搜】四色问题

    题目 问题描述: 设有图4-11所示地图,每个区域代表一个省,区域中的数字代表省的编号,今将每个省涂上红(R),兰(B),黄(Y),白(W)四种颜色之一,使相邻的省份不同颜色,且第一种颜色必须填1. ...

  8. DFS深搜与BFS广搜专题

    一般搜索算法的流程框架 DFS和BFS与一般搜索流程的关系 如果一般搜索算法流程4使用的是stack栈结构(先进后出,后进先出)那么就会越搜越深.即,DFS,DFS只保存当前一条路径,其目的是枚举出所 ...

  9. zzuli oj 2532: 婷婷是土豪 DFS深搜

    2532: 婷婷是土豪 题目描述 众所周知婷婷是我们组大土豪,组里找他借钱和还钱的都有一大堆,借钱的太多了,每天晚上他都要抱怨没钱了. 每天早上,找婷婷借钱的都排成一条长队,假设还钱的有m个,借钱的有 ...

最新文章

  1. 对着电脑笑了二十分钟(2)
  2. 新手友好系列:网页制作这些环节需要着重强调!
  3. 与登录shell相关的文件
  4. java 自定义注释_带有自定义注释的Java注释教程
  5. ICWAI和ICWA的完整形式是什么?
  6. HLG 1532 The Bookcase
  7. python函数及方法大全_Python常用方法和技巧汇总
  8. 计算智能的三个主要分支及其应用
  9. 微信小程序或微信网页里关注公众号
  10. 妙用thead封装vue组件
  11. 携程的旅游知识图谱构建和应用
  12. JetPack-Compose - Flutter 动态UI?
  13. 网站自动跳转到Cjb.Net的惊险之旅
  14. 游戏的本质【转自网易】
  15. STLINK下载程序出现cannot access target. shutting down debug session问题解决的一般步骤
  16. doc转换成html接口,九云图文档转换接口在线word转pdf,pdf转html,doc转pdf等各种文档相互转换的接口...
  17. 【Unity数据持久化】Ixmllserializable接口的使用
  18. 访问Oracle数据库的四款工具软件介绍
  19. 二十种电容分类详解(附常用电子元件实物图片大全)
  20. CleanMyMac X mac2021系统优化清理软件激活云盘分享推荐

热门文章

  1. Golang服务平滑重启
  2. 单一职责原则(Single Responsibility Principle,SRP)
  3. 《Redis设计与实现》第4章 字典
  4. 软件测试实验——对新冠肺炎病毒自助检测等(1)
  5. nandflash驱动
  6. 京东科技埋点数据治理和平台建设实践
  7. c语言比特和字节,详解 比特(位,bit),字节(Byte),字符的区别 *(转)
  8. 酷派 cool 30参数配置 酷派 cool 30评测怎么样
  9. Java的万能进制转换
  10. python安装opencv库 anaconda虚拟环境pytorch安装opencv