CODEVS1358【DFS/状压DP】
题目链接【http://codevs.cn/problem/1358/】
题意:这个游戏在一个有10*10个格子的棋盘上进行,初始时棋子位于左上角,终点为右下角,棋盘上每个格子内有一个0到9的数字,每次棋子可以往右方或下方的相邻格子移动,求一条经过数字之和最小且经过0到9的所有数字的合法路径,输出其长度。(经过的数字包括左上角和右下角)。
思路一:深搜(DFS),因为他只可以向左走或又走,那么每次有两个方向,走到终点的时候,最多走了20步,所以深度最深为20,可解。
#include<cstdio>
#include<cstring>
#include<algorithm>
const int inf = 1e9 + ;
using namespace std;
int a[][];
int ans = inf;
void DFS(int x, int y, int k, int sum)
{
if(x < || x > || y < || y > ) return ;
k |=( << a[x][y]);
sum += a[x][y];
if(x == && y == && k == )
ans = min(ans, sum);
DFS(x + , y, k, sum);
DFS(x, y + , k, sum);
}
int main ()
{
for(int i = ; i <= ; i++)
for(int j = ; j <= ; j++)
scanf("%d", &a[i][j]);
DFS(, , , );
printf("%d\n", ans);
}
思路二:状压DP,dp[i][j][s],表示,要走(i,j)这个格子,s[0,(1<<10)-1],如果s中的第i位为1,表示到达dp[i][j][s]这个状态的时候数字i已经被访问过了,如果为0那么表示数字i没有被访问过,最后输出dp[10][10][(1<<10)-1];
#include<cstdio>
#include<cstring>
#include<algorithm>
const int inf = 1e9 + ;
using namespace std;
int a[][];
int dp[][][ << ];
int main ()
{
for(int i = ; i <= ; i++)
for(int j = ; j <= ; j++)
scanf("%d", &a[i][j]);
memset(dp,0x3f3f3f,sizeof(dp));
for(int i = ; i <= ; i++)
for(int j = ; j <= ; j++)
{
if(i == && j == )
{
dp[i][j][ << a[i][j]] = a[i][j];
continue;
}
for(int k = ; k < ( << ); k++)
{
if(k & ( << a[i][j]))
{
if(i > )
dp[i][j][k] = a[i][j] + min(dp[i - ][j][k - ( << a[i][j])], dp[i - ][j][k]);
if(j > )
dp[i][j][k] = min(dp[i][j][k], a[i][j] + min(dp[i][j - ][k - ( << a[i][j])], dp[i][j - ][k]));
}
}
}
printf("%d\n", dp[][][( << ) - ]);
}
CODEVS1358【DFS/状压DP】的更多相关文章
- POJ 1321 棋盘问题(DFS & 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...
- Calculation(dfs+状压dp)
Problem 1608 - Calculation Time Limit: 500MS Memory Limit: 65536KB Total Submit: 311 Accepted: ...
- Atcoder Beginner Contest152F(DFS+状压DP)
二维状压写成一维状压,省略加上第i条边这一维 #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace st ...
- codevs1358棋盘游戏(状压dp)
1358 棋盘游戏 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description 这个游戏在一个有10*10个格子的棋盘上进行,初 ...
- 【62测试】【状压dp】【dfs序】【线段树】
第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
- UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)
题意:给一个的格子图,有 n 行单元格,每行有a[i]个格子,要求往格子中填1~m的数字,要求每个数字大于等于左边的数字,大于上边的数字,问有多少种填充方法. 析:感觉像个DP,但是不会啊...就想暴 ...
- HDU 4272 LianLianKan (状压DP+DFS)题解
思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...
- 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...
随机推荐
- Centos7系统环境下Solr之Java实战(二)制定中文分析器、配置业务域
制定中文分析器 1.把IKAnalyzer2012FF_u1.jar添加到solr工程的lib目录下 2.把扩展词典.配置文件放到solr工程的WEB-INF/classes目录下. 配置一个Fiel ...
- C语言易错点
C语言易错点 1.每个C语言程序中main函数是有且只有一个的. 2.算法可以没有输入,但必须要有输出. 3.在函数中不可以再定义函数. 4.break可用于循环结构和switch语句. 5.brea ...
- Let's Encrypt 免费通配 https 签名证书 安装方法
安装环境 centOs7 主要通过 acme.sh (bash脚本)来注册签名 git地址:https://github.com/Neilpang/acme.sh 申请证书流程 1.申请证书-> ...
- Perl6多线程3: Promise start / in / await
创建一个Promise 并自动运行: my $p = Promise.start({say 'Hello, Promise!'}); 如果把代码改成如下, 我们会发现什么也没打印: ;say 'Hel ...
- for 、forEach 、 forof、 forin遍历对比
一.遍历内容的异同 1.for 和 for...in 是针对数组下标的遍历 2.forEach 及 for...of 遍历的是数组中的元素 二.对非数字下标的处理 由于array在js中也是对象中的一 ...
- 002_让你的linux虚拟终端五彩缤纷(1)——LS颜色设置
- css的背景图片background
1.使用背景图片的标签定设置宽高,没有设置的话,也需要用内容来撑开标签. 2.如果对同一个标签分开设置背景图片和颜色,背景颜色一定要写在背景图片后面,不然会被覆盖 <!DOCTYPE html& ...
- Python如何实现文本转语音
准备 我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了. 使用Speech API 原理 我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相 ...
- angular项目中使用Primeng
1.第一步把依赖添加到项目中 npm install primeng --save npm install @angular/animations --save npm install font-aw ...
- 如何优雅地使用vim编辑器
如何优雅地使用vim编辑器大赞..原文链接:http://jackiekuo.com/code/2014/05/07/use-vim-the-pragmatic-way/ 接上篇如何优雅地使用Vim? ...