题面传送门

题意:

有两个人 A 和 B 玩一个游戏。游戏规则大致是这样的:

有 \(n\) 个城市和三种交通工具公交、地铁和出租车。

给出三个 \(n\times n\) 的字符矩阵 \(b,m,t\),\(b_{i,j}='Y'\) 表示从城市 \(i\) 可以通过公交到达城市 \(j\),\(b_{i,j}='N'\) 表示从城市 \(i\) 不可以通过公交到达城市 \(j\)。\(m,t\) 同理。

现在 A 要选择一个起始城市 \(i\),但是 B 不知道这个城市的编号。小 A 每次可以通过某种交通工具到达另一个城市,并将乘坐的交通工具告诉 B。如果 B 猜出了小 A 当前所在的城市,或者小 B 动不了了,游戏结束。

A 的得分为 A 经过的边数。求 A 得分的最大值,如果游戏可能永远进行下去,输出 -1。

\(1 \leq n \leq 50\)

话说这题出现了两次呢。。。记得 CSP 前一周学校模拟赛某道题就是这个,结果昨天模拟赛又出现了一遍。。。今天终于见到这题的真面貌了(

记 \(S\) 为当前 A 当前可能位于的城市的集合。初始 \(S=\{1,2,\dots,n\}\)。

如果小 A 搭乘了交通工具 \(x\),那么 \(S\) 就变为:\(S\) 中的点集通过交通工具 \(x\) 能到达的点。

答案就是最多进行多少次操作后 \(S\) 中剩一个点。

很容易想到 \(2^n\) 的做法,对于集合之间的相互转化关系连边,跑最长路。


其实并不用把集合中每个点都表示出来。

只需要找到两个代表点 \((i,j)\),对这些点对连边跑最长路就行了。

这样点的个数就降到了 \(n^2\)。

至于 \(-1\) 的情况,就是判断对点对建立的图中有没有环,记忆化搜索/拓扑排序就可以了。

时间复杂度 \(n^4\),是道思维题(为啥就想不出来呢,wtcl)

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define ffe(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
typedef pair<int,int> pii;
typedef long long ll;
const int MAXN=50+5;
int n,dp[MAXN][MAXN],vis[MAXN][MAXN];
bool s1[MAXN][MAXN],s2[MAXN][MAXN],s3[MAXN][MAXN];
int dfs(int x,int y){
if(x>y) swap(x,y);
if(x==y) return 0;
if(vis[x][y]) return 1e9;
if(~dp[x][y]) return dp[x][y];
vis[x][y]=1;dp[x][y]=0;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
if((s1[x][i]&&s1[y][j])||(s1[x][i]&&s1[x][j])||(s1[y][i]&&s1[y][j])||
(s2[x][i]&&s2[y][j])||(s2[x][i]&&s2[x][j])||(s2[y][i]&&s2[y][j])||
(s3[x][i]&&s3[y][j])||(s3[x][i]&&s3[x][j])||(s3[y][i]&&s3[y][j]))
dp[x][y]=max(dp[x][y],dfs(i,j)+1);
}
vis[x][y]=0;return dp[x][y];
}
class ScotlandYard{
public:
int maxMoves(vector<string> taxi,vector<string> bus,vector<string> metro){
n=taxi.size();
for(int i=0;i<n;i++) for(int j=0;j<n;j++) s1[i+1][j+1]=(taxi[i][j]=='Y');
for(int i=0;i<n;i++) for(int j=0;j<n;j++) s2[i+1][j+1]=(bus[i][j]=='Y');
for(int i=0;i<n;i++) for(int j=0;j<n;j++) s3[i+1][j+1]=(metro[i][j]=='Y');
int ans=0;memset(dp,-1,sizeof(dp));
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) ans=max(ans,dfs(i,j));
if(ans>=1e9) return -1;return ans;
}
};
//ScotlandYard program;
//int main(){
// int n;scanf("%d",&n);
// vector<string> taxi,bus,metro;
// for(int i=1;i<=n;i++){string s;cin>>s;taxi.pb(s);}
// for(int i=1;i<=n;i++){string s;cin>>s;bus.pb(s);}
// for(int i=1;i<=n;i++){string s;cin>>s;metro.pb(s);}
// printf("%d\n",program.maxMoves(taxi,bus,metro));
// return 0;
//}

Topcoder 12519 ScotlandYard(点对 dp+最长路)的更多相关文章

  1. [USACO2003][poj2138]Travel Games(dp/最长路)

    http://poj.org/problem?id=2138 题意:给你一些单词和初始单词,在初始单词的任意位置你可以加任意一个字母,使得这个新单词在给的单词中有所出现,然后在这样不断迭代下去,让你求 ...

  2. UVA11324 The Largest Clique (强连通缩点+DP最长路)

    <题目链接> 题目大意: 给你一张有向图 G,求一个结点数最大的结点集,使得该结点集中的任意两个结点 u 和 v 满足:要么 u 可以达 v,要么 v 可以达 u(u,v相互可达也行). ...

  3. ZOJ 3795 Grouping (强连通缩点+DP最长路)

    <题目链接> 题目大意: n个人,m条关系,每条关系a >= b,说明a,b之间是可比较的,如果还有b >= c,则说明b,c之间,a,c之间都是可以比较的.问至少需要多少个集 ...

  4. The Largest Clique UVA - 11324( 强连通分量 + dp最长路)

    这题  我刚开始想的是  缩点后  求出入度和出度为0 的点  然后统计个数  用总个数 减去 然而 这样是不可以的  画个图就明白了... 如果  减去度为0的点  那么最后如果出现这样的情况是不可 ...

  5. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

  6. ZOJ 3795:Grouping(缩点+最长路)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5303 题意:有n个人m条边,每条边有一个u,v,代表u的年龄大于等于v,现在要 ...

  7. hdu 1025 dp 最长上升子序列

    //Accepted 4372 KB 140 ms //dp 最长上升子序列 nlogn #include <cstdio> #include <cstring> #inclu ...

  8. poj1159 dp最长公共子串

    //Accepted 204 KB 891 ms //dp最长公共子串 //dp[i][j]=max(dp[i-1][j],dp[i][j-1]) //dp[i][j]=max(dp[i][j],dp ...

  9. 中南大学oj 1317 Find the max Link 边权可以为负的树上最长路 树形dp 不能两遍dfs

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs.反例:5 41 2 22 ...

随机推荐

  1. javascript-jquery对象的其他处理

    一.对元素进行遍历操作 如果要遍历一个jquery对象,对其中每个匹配元素进行相应处理,那么可以使用each()方法. $("div").each(function(index,e ...

  2. Unity——伤害数字显示HUD

    伤害数字显示HUD 游戏中收到伤害掉血,会有飘动的伤害数值: 可以使用OnGUI中GUI.Label来实现: 可自定义字体,颜色,大小等: 如果需要更好看的数字特效,可以手动添加: 普通字体不够好看可 ...

  3. Kafka消息(存储)格式及索引组织方式

    要深入学习Kafka,理解Kafka的存储机制是非常重要的.本文介绍Kafka存储消息的格式以及数据文件和索引组织方式,以便更好的理解Kafka是如何工作的. Kafka消息存储格式 Kafka为了保 ...

  4. Scrum Meeting 0605

    零.说明 日期:2021-6-5 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 暂无 重新设 ...

  5. OO第四次博客作业--第四单元总结及课程总结

    一.总结第四单元两次作业的架构设计 1.1 第一次作业 类图如下: 为了突出类.接口.方法.属性.和参数之间的层次结构关系,我为 Class 和 Interface 和 Operation 分别建立了 ...

  6. mac上安装lua

    一.背景 最近在操作redis的时候,有些时候是需要原子操作的,而redis中支持lua脚本,因此为了以后学习lua,此处记录一下 lua的安装. 二.mac上安装lua 其余的系统上安装lua步骤大 ...

  7. CSP-S2021幽寂

    不管怎么说,这次比赛考的比这一段时间以来的模拟赛都难看 难受,但是也不想太表现出来,所以更难受.... 有点害怕会退役...... Day -6 前一天晚上回宿舍的时候和\(zxs\)一路,聊的过程中 ...

  8. CF398A Cards | 贪心

    题目链接 我怎么连这种题都做得那么艰难-- 可以发现一些结论,然后枚举'x'被分成几段就好了. 我真的越来越菜 #include<iostream> #include<cstdio& ...

  9. 更优于 Shellinabox 的 web shell 工具 -- ttyd

    ttyd 是一个运行在服务端,客户端通过web浏览器访问从而连接后台 tty (pts伪终端)接口的程序,把 shell 终端搬到 web 浏览器中. WebSocket WebSocket 是 HT ...

  10. 重新整理 .net core 实践篇——— filter[四十四]

    前言 简单介绍一下filter 正文 filter 的种类,微软文档中写道: 每种筛选器类型都在筛选器管道中的不同阶段执行: 授权筛选器最先运行,用于确定是否已针对请求为用户授权. 如果请求未获授权, ...