最大联通子数组,这次的题目,我采用的方法为dfs搜索,按照已经取到的数v[][],来进行搜索过程的状态转移,每次对v[][]中标记为1的所有元素依次取其相邻的未被标记为1的元素,将其标记为1,然而,这样会产生很大的子问题重合,所以必须利用dp来进行记忆化搜索,dp为一集合,集合中的元素为已在前面出现过的v[][]的状态,

然而v[][]为一个二维数组,很不方便存入set,所以使用将v[][]的行经行状态压缩,使用位运算,将行存入 long long 型数中,在按列存入vector中

  1. #include<iostream>
  2. #include<cstring>
  3. #include<vector>
  4. #include<set>
  5. using namespace std;
  6. int map[][];
  7. bool v[][];
  8. set<vector<long long> > dp;
  9. int ans,m,n;
  10. int xd,yd;
  11. int x[]={,,-,};
  12. int y[]={,,,-};
  13. bool isOK(int x,int y){
  14. if(x<||y<)return ;
  15. if(x>m||y>n)return ;
  16. return ;
  17. }
  18. vector<long long> toNUM(){
  19. vector<long long> a;
  20. for(int i=;i<=m;i++){
  21. long long aa=;
  22. for(int j=;j<=n;j++){
  23. if(v[i][j]){
  24. long long s=<<(j-);
  25. aa=aa|s;
  26. }
  27. }
  28. a.push_back(aa);
  29. }
  30. return a;
  31. }
  32. int co=;
  33. void dfs(int nowAns){
  34. if(nowAns>ans){
  35. ans=nowAns;
  36. }
  37. for(int ii=;ii<=m;ii++){
  38. for(int jj=;jj<=n;jj++){
  39. if(v[ii][jj]){
  40. for(int i=;i<;i++){
  41. if(isOK(ii+x[i],jj+y[i])&&(v[ii+x[i]][jj+y[i]]==)){
  42. v[ii+x[i]][jj+y[i]]=;
  43. vector<long long> s=toNUM();co++;
  44. if(dp.count(s)==) dp.insert(s),dfs(nowAns+map[ii+x[i]][jj+y[i]]);
  45. v[ii+x[i]][jj+y[i]]=;
  46. }
  47. }
  48. }
  49. }
  50. }
  51. }
  52. int main(){
  53. cin>>m>>n;
  54. for(int i=;i<=m;i++){
  55. for(int j=;j<=n;j++){
  56. cin>>map[i][j];
  57. }
  58. }
  59. for(int i=;i<=m;i++){
  60. for(int j=;j<=n;j++){
  61. xd=i;yd=j;
  62. v[i][j]=;
  63. dfs(map[i][j]);
  64. memset(v,,sizeof(v));
  65. }
  66. }
  67. // cout<<co<<endl;
  68. cout<<ans<<endl;
  69. return ;
  70. }

最大联通子数组之和(dfs,记忆化搜索,状态压缩)的更多相关文章

  1. 不要62 hdu 2089 dfs记忆化搜索

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中 ...

  2. dfs+记忆化搜索,求任意两点之间的最长路径

    C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...

  3. 蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索

    历届试题 地宫取宝   时间限制:1.0s   内存限制:256.0MB 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角 ...

  4. POJ 1191 棋盘分割 【DFS记忆化搜索经典】

    题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  5. hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)

    pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/ ...

  6. hdu 1078(dfs记忆化搜索)

    题意:容易理解... 思路:我开始是用dfs剪枝做的,968ms险过的,后来在网上学习了记忆化搜索=深搜形式+dp思想,时间复杂度大大降低,我个人理解,就是从某一个点出发,前面的点是由后面的点求出的, ...

  7. UVA 10400 Game Show Math (dfs + 记忆化搜索)

    Problem H Game Show Math Input: standard input Output: standard output Time Limit: 15 seconds A game ...

  8. 8636 跳格子(dfs+记忆化搜索)

    8636 跳格子 该题有题解 时间限制:2457MS  内存限制:1000K提交次数:139 通过次数:46 题型: 编程题   语言: G++;GCC Description 地上有一个n*m 的数 ...

  9. poj1088-滑雪 【dfs 记忆化搜索】

    http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 79806 ...

随机推荐

  1. 加速Eclipse使其成为超快的IDE

    按照下述步骤来加速Eclipse为超快的IDE,它适用于32和64位版本的Eclipse /JDK(OS为64位Windows 7). 1.禁用防病毒软件,或将JDK.Eclipse.workspac ...

  2. ARM-linux嵌入式开发平台搭建1

    初学嵌入式开发,由于是自学,走了很多弯路,现总结一下嵌入式ARM-LINUX开发环境搭建步骤: 1.安装linux系统,由于初学,我选择fedora 14.安装的具体步骤就不详细说了. 2.安装NFS ...

  3. MYSQL 【汇总数据】 【分组数据】 学习记录

    分组数据 1,创建分组:

  4. java main函数

    public static void main(String[] args)[String args[]]也对 1)public :公共的权限最大,在任何情况下都可以访问. 原因:为了保证java虚拟 ...

  5. Unity3D Mecanim 动画系统骨骼动画问题解决方法

    http://7dot9.com/2014/08/16/unity3d-mecanim%E5%8A%A8%E7%94%BB%E7%B3%BB%E7%BB%9F%E9%AA%A8%E9%AA%BC%E5 ...

  6. 【转】 C++ vector用法

    在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<in ...

  7. C++编译错误cannot have cv-qualifier

    C++编译错误cannot have cv-qualifier 在C++中CV指const和volatile两个关键字.有两种情况不能使用CV限定. 一.非成员函数不能含有CV限定,即const和vo ...

  8. JavaScript window

    window -- window对象是BOM中所有对象的核心 window,中文"窗口" window对象除了是BOM中所有对象的父对象外,还包含一些窗口控制函数 全局的windo ...

  9. 关于MySQL回滚机制

    在事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作,此时事务会将之前的操作进行回滚.回滚的意思是如果之前是插入操作,那么会执行删 除插入的记录,如果之前是update操作,也会执行up ...

  10. angular-ui-router状态不变刷新页面

    需求: 当前在A页面状态,要求在点击A状态时,可以刷新A状态. 解决方法:在ui-sref状态切换的标签中添加属性 ui-sref-opts="{reload: true}"   ...