Codeforces 374 C. Travelling Salesman and Special Numbers (dfs、记忆化搜索)
题目链接:Travelling Salesman and Special Numbers
题意:
给了一个n×m的图,图里面有'N','I','M','A'四种字符。问图中能构成NIMA这种序列最大个数(连续的,比如说NIMANIMA = 2)为多少,如果有环的话那么最大长度就是无穷。
题解:
哇,做了这题深深得感觉自己的dfs真的好弱。这题就是从N开始深搜,在深搜的过程中记录值。返回这个值加1.
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e3+;
const int INF = 1e9+;
typedef pair<int,int> P;
char vec[MAX_N][MAX_N];
int mp[MAX_N][MAX_N];
int res[MAX_N][MAX_N];
int vis[MAX_N][MAX_N];
int dir[][] = {-,,,,,,,-};
int ans,flag,N,M,T;
queue<P> que;
vector<P> st;
int dfs(int x,int y,int pos)
{
if(vis[x][y])
{
flag = false; return INF;
}
if(res[x][y]) return res[x][y];
vis[x][y] = ;
int num =;
for(int i=;i<;i++)
{
int nx = x + dir[i][];
int ny = y + dir[i][];
if(nx>= && nx<N && ny>= && ny<M && mp[nx][ny] == (pos+)% )
{
num = max(num,dfs(nx,ny,(pos+)%));
}
}
res[x][y] = num+;
vis[x][y] = ;
return num+;
}
int main()
{
cin>>N>>M;
memset(vis,,sizeof(vis));
memset(res,,sizeof(res));
st.clear();
for(int i=; i<N; i++)
{
scanf("%s",vec[i]);
for(int j=; j<M; j++)
{
if(vec[i][j] == 'D') mp[i][j] = ,st.push_back(P(i,j));
else if(vec[i][j] == 'I') mp[i][j] = ;
else if(vec[i][j] == 'M') mp[i][j] = ;
else if(vec[i][j] == 'A') mp[i][j] = ;
}
}
int out = ;
flag = true;
for(int i=;i<st.size();i++)
{
if(res[st[i].first][st[i].second] != || vis[st[i].first][st[i].second]) continue;
int t = dfs(st[i].first,st[i].second,);
if(!flag) break;
out = max(out,t/);
}
if(flag)
{
if(out != ) cout<<out<<endl;
else cout<<"Poor Dima!"<<endl;
}
else cout<<"Poor Inna!"<<endl;
return ;
}
/*
5 5
DIADD
DMADD
DDDID
AMMMD
MIDAD answer: 3
*/
Codeforces 374 C. Travelling Salesman and Special Numbers (dfs、记忆化搜索)的更多相关文章
- Codeforces 914 C. Travelling Salesman and Special Numbers (数位DP)
题目链接:Travelling Salesman and Special Numbers 题意: 给出一个二进制数n,每次操作可以将这个数变为其二进制数位上所有1的和(3->2 ; 7-> ...
- Codeforces 914 C Travelling Salesman and Special Numbers
Discription The Travelling Salesman spends a lot of time travelling so he tends to get bored. To pas ...
- Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)
D. MADMAX time limit per test1 second memory limit per test256 megabytes Problem Description As we a ...
- 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)
链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- Codeforces Global Round 23 D.Paths on the Tree(记忆化搜索)
https://codeforces.ml/contest/1746/problem/D 题目大意:一棵n节点有根树,根节点为1,分别有两个数组 s[i] 顶点 i 的魅力值 c[i] 覆盖顶点 i ...
- Codeforces 914C Travelling Salesman and Special Numbers:数位dp
题目链接:http://codeforces.com/problemset/problem/914/C 题意: 对数字x进行一次操作,可以将数字x变为x在二进制下1的个数. 显然,一个正整数在进行了若 ...
- Travelling Salesman and Special Numbers CodeForces - 914C (数位dp)
大意: 对于一个数$x$, 每次操作可将$x$变为$x$二进制中1的个数 定义经过k次操作变为1的数为好数, 求$[1,n]$中有多少个好数 注意到n二进制位最大1000位, 经过一次操作后一定变为1 ...
- Codeforces 914C Travelling Salesman and Special Numbers (数位DP)
题意:题目中定义了一种运算,把数字x变成数字x的二进制位数.问小于n的恰好k次运算可以变成1的数的个数(题目中的n是二进制数,n最大到2^1000) 思路:容易发现,无论多么大的数,只要进行了一次运算 ...
- 【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) C】 Travelling Salesman and Special Numbers
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现. 进行一次操作过后. 得到的数字肯定是<=1000的 然后1000以下可以暴力做的. 则我们枚举第1步后得到的数字x是 ...
随机推荐
- 教你如何获取ipa包中的开发文件
教你如何获取ipa包中的开发文件 1. 从iTunes获取到ipa包 2. 修改ipa包然后获取里面的开发文件
- 封装用于解析NSDate的便利的类
封装用于解析NSDate的便利的类 此类可以从NSDate中解析出年份,月份,日期,时,分,秒,毫秒,足够用来做好多事情了,现提供源码如下: 以下是核心的类: TimeInfo.h 与 TimeInf ...
- nginx安装脚本
#!/bin/bash#auto config Nginx#by zhangjia 2019#define Path variables#date:2019/1/16 check_ok() { ]] ...
- 【php】页面加载优化的14条原则
1. 尽可能的减少 HTTP 的请求数 [content] 2. 使用 CDN(Content Delivery Network) [server] 3. 添加 Expires 头(或者 Cach ...
- python3: 字符串和文本(3)
11. 删除字符串中不需要的字符 strip() 方法能用于删除开始或结尾的字符: lstrip() 和 rstrip() 分别从左和从右执行删除操作 >>> s = ' hell ...
- 全部读取------------ 一次性全部读取的.read() VS 一行一行的for迭代
全部读取 f = open("喜洋洋",mode= "r",encoding= "utf-8") 方法一: 一次性全部读取f = o ...
- kafka for Windows
1,保证,安装好java环境,zookeeper,并且运行zookeeper. 2,下载kafka,并解压到磁盘 下载链接http://mirrors.hust.edu.cn/apache/kafka ...
- 常见dos命令(win7下测试)
按下组合键:win + R ,输入cmd进入Dos. 1. cls :清屏命令. 2. ver :查看系统版本号命令,winver弹出一个窗口显示更详细的系统版本号. 3. dir 无参数 : ...
- [SHOI2008]小约翰的游戏
题目 不会,抄论文 这是一个非常牛逼的东西,叫做\(anti\)博弈,就是进行最后一次操作的人输 我们考虑一下这道题 显然如果石子个数都是\(1\),那么有奇数堆石子先手必败,有偶数堆石子先手必胜 如 ...
- ZooKeeper学习之路 (十)Hadoop的HA集群的机架感知
一.背景 Hadoop 的设计目的:解决海量大文件的处理问题,主要指大数据的存储和计算问题,其中, HDFS 解决数据的存储问题:MapReduce 解决数据的计算问题 Hadoop 的设计考虑:设计 ...