最大联通子数组之和(dfs,记忆化搜索,状态压缩)
最大联通子数组,这次的题目,我采用的方法为dfs搜索,按照已经取到的数v[][],来进行搜索过程的状态转移,每次对v[][]中标记为1的所有元素依次取其相邻的未被标记为1的元素,将其标记为1,然而,这样会产生很大的子问题重合,所以必须利用dp来进行记忆化搜索,dp为一集合,集合中的元素为已在前面出现过的v[][]的状态,
然而v[][]为一个二维数组,很不方便存入set,所以使用将v[][]的行经行状态压缩,使用位运算,将行存入 long long 型数中,在按列存入vector中
#include<iostream>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
int map[][];
bool v[][];
set<vector<long long> > dp;
int ans,m,n;
int xd,yd;
int x[]={,,-,};
int y[]={,,,-};
bool isOK(int x,int y){
if(x<||y<)return ;
if(x>m||y>n)return ;
return ;
}
vector<long long> toNUM(){
vector<long long> a;
for(int i=;i<=m;i++){
long long aa=;
for(int j=;j<=n;j++){
if(v[i][j]){
long long s=<<(j-);
aa=aa|s;
}
}
a.push_back(aa);
}
return a;
}
int co=;
void dfs(int nowAns){
if(nowAns>ans){
ans=nowAns;
}
for(int ii=;ii<=m;ii++){
for(int jj=;jj<=n;jj++){
if(v[ii][jj]){
for(int i=;i<;i++){
if(isOK(ii+x[i],jj+y[i])&&(v[ii+x[i]][jj+y[i]]==)){
v[ii+x[i]][jj+y[i]]=;
vector<long long> s=toNUM();co++;
if(dp.count(s)==) dp.insert(s),dfs(nowAns+map[ii+x[i]][jj+y[i]]);
v[ii+x[i]][jj+y[i]]=;
}
}
}
}
}
}
int main(){
cin>>m>>n;
for(int i=;i<=m;i++){
for(int j=;j<=n;j++){
cin>>map[i][j];
}
}
for(int i=;i<=m;i++){
for(int j=;j<=n;j++){
xd=i;yd=j;
v[i][j]=;
dfs(map[i][j]);
memset(v,,sizeof(v));
}
}
// cout<<co<<endl;
cout<<ans<<endl;
return ;
}
最大联通子数组之和(dfs,记忆化搜索,状态压缩)的更多相关文章
- 不要62 hdu 2089 dfs记忆化搜索
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中 ...
- dfs+记忆化搜索,求任意两点之间的最长路径
C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...
- 蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索
历届试题 地宫取宝 时间限制:1.0s 内存限制:256.0MB 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角 ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)
pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 1078(dfs记忆化搜索)
题意:容易理解... 思路:我开始是用dfs剪枝做的,968ms险过的,后来在网上学习了记忆化搜索=深搜形式+dp思想,时间复杂度大大降低,我个人理解,就是从某一个点出发,前面的点是由后面的点求出的, ...
- UVA 10400 Game Show Math (dfs + 记忆化搜索)
Problem H Game Show Math Input: standard input Output: standard output Time Limit: 15 seconds A game ...
- 8636 跳格子(dfs+记忆化搜索)
8636 跳格子 该题有题解 时间限制:2457MS 内存限制:1000K提交次数:139 通过次数:46 题型: 编程题 语言: G++;GCC Description 地上有一个n*m 的数 ...
- poj1088-滑雪 【dfs 记忆化搜索】
http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 79806 ...
随机推荐
- Windows Performance Monitoring with perfmon
直接引用 - https://technet.microsoft.com/en-us/magazine/2008.08.pulse.aspx
- samba服务器搭建
为实现windows与linux资源共享,搭建一个samba服务器:这个我也是探索了一段时间. 找到一篇写得比较清楚的博客: http://yangxuejun.blog.51cto.com/6239 ...
- graph-tool文档(一)- 快速开始使用Graph-tool - 2.属性映射、图的IO和Price网络
目录: 属性映射 -- 内部属性映射 图的I/O 构建一个 Price网络(例) 名词解释: Property maps:属性映射 PropertyMap:一个类 scalar value types ...
- WebDriver - 添加失败截图
WebDriver失败截图可以通过两种方式实现: 1. Use WebdriverEventListener 第一步:创建自己的WebDriverEventListener 创建自己的WebDrive ...
- WebDriver 在使用 CSS Selector 与 XPath 在查找元素时如何取舍
开发在做Web系统时,用的是css div划分层,使用jQuery 选取元素.
- DirectX小记
1.关于SetViewPort 如果不调用SetViewPort,那么设备对应的ViewPort是什么. 2.关于多线程渲染 如果逻辑线程和渲染线程分开, 则存在两种渲染方式 a.逻辑线程一次性提交渲 ...
- 谈谈HttpUrlConnection与DefaultHttpClient一些区别
HttpClient封装的很庞大,很复杂,你必须按照,他封装的思想去使用它,导致它很不灵活. 相比之下,HttpUrlConnection很轻巧,很方便,很灵活. HttpClient对于数据上面的封 ...
- jq实现多级手风琴效果
/*左侧*/ .wrapper, .main { height: 100%; z-index: 9 } .main { position: relative; } .main_L { width: 2 ...
- [Java] java文件读写操作大全
一.获得控制台用户输入的信息 //可以返回用户输入的信息,不足之处在于不支持中文输入,有待进一步改进 public String getInputMessage() throws IOExceptio ...
- 《Java程序设计》第三周学习总结
20145224-陈颢文 <Java程序设计>第三周学习总结 教材学习内容总结 一.定义类: ·类定义时使用class关键字,要对类中变量(值域成员/对象数据成员)行类型声明. class ...