整理的算法模板合集: ACM模板


题目传送门


三段题面,只有第三段是有用的…前两段又长单词又难懂,就是在讲故事。。。不过针对四种情况给出四个图帮助我们理解题意是真的赞,可能出题人怕我们看不懂吧(第一句话有好几个生词没见过让我怀疑这是不是英语 )

题目大意就是一个n*m的矩阵,每一个格子上都有一个数字,我们可以从任意的点出发,每次向上下左右四个方向走,只能到有公共边的格子上去,求一共有多少条完整路径。

其中完整路径的定义是整条路上数字从1连续地走到n,其中如果到n了以后他的四个方向都没有n+1也就是不能继续往下走了才算到终点。(还有一个要求就是路径的长度必须大于等于4才算)

我们直接按照题意建图,把每一个点的四周能到的点连边,其中每一个点的编号就是(i - 1) * m + j,我们要求总的完整路径,由于这是一个DAG,很明显就是一个DAG上拓扑排序递推DP,所以我们直接建图以后拓扑排序,拓扑排序的过程中我们开始递推(实际上我们不用等拓扑排序以后再递推,在排序的过程中这个顺序已经是拓扑序了,已经没有了后效性)。

由于完整路径必须长度大于等于4,所以我们设立四个数组f[N][5],其中f[x][1]表示以该点为起点(权值为1)的路径数f[x][2]表示的是权值为2,也就是是从起点走一步到达的地方的路径数,f[x][3]表示权值为3的路径数,f[x][4]表示的是以x为终点,权值(长度)大于等于4的路径数,我们用一个flag表示是否有路可走,一旦无路可走,我们答案就加上这个终点的f[x][4]的路径数(因为我们只算长度大于等于4的情况,短的路不算完整路径)。

千万注意初始化数组G,以免因为0和1导致连错边

int n, m;
int head[N], ver[M], nex[M], tot;
int f[N][5];
int in[N];
queue<int>q;
int ans;
int G[maxn][maxn];
void add(int x, int y)
{ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;in[y] ++ ;
}
void toposort()
{for(int i = 1; i <= n * m; ++ i){if(!in[i])q.push(i), f[i][1] = 1;//所有起点,赋值为1}while(q.size()){int x = q.front();q.pop();bool flag = true;for(int i = head[x]; ~i; i = nex[i]){int y = ver[i];in[y] -- ;f[y][2] = (f[y][2] + f[x][1]) % mod;f[y][3] = (f[y][3] + f[x][2]) % mod;f[y][4] = (f[y][4] + f[x][3] + f[x][4]) % mod;if(in[y] == 0)q.push(y);flag = false;//没有到终点}if(flag)ans = (ans + f[x][4]) % mod;}
}
int main()
{memset(head, -1, sizeof head);memset(G, 0x3f, sizeof G);//千万注意这个初始化scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++ i)for(int j = 1; j <= m; ++ j)scanf("%d", &G[i][j]);for(int i = 1; i <= n; ++ i)for(int j = 1; j <= m; ++ j){int x, y = (i - 1) * m + j;if(i > 1)if(G[i - 1][j] == G[i][j] - 1)x = (i - 2) * m + j, add(x, y);if(j > 1)if(G[i][j - 1] == G[i][j] - 1)x = y - 1, add(x, y);if(i < n)if(G[i + 1][j] == G[i][j] - 1)x = y + m, add(x, y);if(j < m)if(G[i][j + 1] == G[i][j] - 1)x = y + 1, add(x, y);}toposort();printf("%d", ans % mod);return 0;
}

2019 ICPC Asia Nanjing Regional C.Digital Path(拓扑排序递推DP)相关推荐

  1. 2019 ICPC Asia Nanjing Regional

    题号 题目 难度 知识点 A A Hard Problem 签到题 思维题 B Chessboard C Digital Path 签到题 dfs+记忆化搜索 D Holes E Observatio ...

  2. The 2019 ICPC Asia Nanjing Regional Contest(A、C、K)

    A. A Hard Problem 在全排列1到n中每k个数作为一段,每段必存在u,v使得u是v的一个因子,考虑每段最短是多长,直接倒着考虑,假如n=6,最后肯定是要3...6才能符合题意,假如n=7 ...

  3. 2019 ICPC Asia Nanjing Regional J.Spy(KM算法O(n^3)板子题)

    整理的算法模板合集: ACM模板 前面好几段又在讲故事- 题目大意: a[i]表示对手的每个队伍战斗力 p[i]表示打败对手后获得的分数 b[i]表示我方第一种人的战斗力 c[i]表示我方第二种人的战 ...

  4. 2019 ICPC Asia Nanjing Regional K.Triangle(求一个能将三角形分成两个面积相同的线段、计算几何)

    整理的算法模板合集: ACM模板 题目传送门 用板子判断点是否在线段上即可.紫书的板子有点问题,判断是否在线段上的时候应该是<=才能A,书上是 < - 对于第二问我们先特判一下特殊的情况, ...

  5. 2019 ICPC Asia Nanjing Regional I. Space Station题解

    文章目录 [题目链接] [前言] [题目大意] [解题思路] 一.优先暴力 二.记忆化 三.unordered_map以及思维优化 四.乘法逆元(拓展内容) [后记] [题目链接] https://n ...

  6. 2019 ICPC Asia Yinchuan Regional(9 / 13)

    2019 ICPC Asia Yinchuan Regional A - Girls Band Party(分组背包) 每个物品有两个标签,名字,颜色,当名字是设置为奖赏时会对整体加上0.1 的贡献, ...

  7. The 2019 ICPC Asia Shanghai Regional Contest

    The 2019 ICPC Asia Shanghai Regional Contest 题号 题目 知识点 A Mr. Panda and Dominoes B Prefix Code C Maze ...

  8. 2019 ICPC Asia Nanchang Regional

    2019 ICPC Asia Nanchang Regional C. And and Pair E. Bob's Problem 链接:https://www.jisuanke.com/contes ...

  9. 2019 ICPC Asia Yinchuan Regional H - Delivery Route 强连通+最短路+拓扑

    原题链接:https://nanti.jisuanke.com/t/42388 目录 题意 分析 Code 题意 有n个点,x条双向边且边权为正,y条单向边边权可以为负,问从某个点出发到全部点的最短距 ...

最新文章

  1. java里写分页,自己写的Java分页类
  2. 堆栈转化8进制_11张卡片学会进制转换
  3. asp.net core 2.0 web api基于JWT自定义策略授权
  4. 英语口语-文章朗读Week10 Thursday
  5. docker公共存储库_Docker入门(2)——镜像结构和私有镜像库
  6. 嵌入式系统与人工智能 1
  7. 优化算法 - 遗传算法
  8. 巧用 arp 命令 防p2p终结者的方法
  9. 学习andriod开发之 自己开发短信发送软件
  10. 迷宫生成算法(二)(C++)
  11. 数字化的下一个目标,就是产业链|数字思考者50人
  12. 这招涨粉神术,你不得不学
  13. android 信息-- 发彩信(1)
  14. Excel单元格中怎么批量将两行合并成一行
  15. IBM小型机维护经验2则
  16. C语言小游戏:文字冒险游戏
  17. 行为模式--子类沙箱
  18. 斐波那契数列 - 实现一个斐波那契数列,并且打印出来
  19. WebMatrix开发ASP.NET试用手记[转帖]
  20. PHP curl使用代理ip请求

热门文章

  1. 由线性回归来理解深度学习的理论基础
  2. 详尽 | PyTorch动态图解析
  3. 【OpenCV 4开发详解】两图像间的像素操作
  4. 求最小Hamming距离的DNA序列
  5. Python之操作RabbitMQ
  6. 二叉树学习笔记之树的旋转
  7. HLA高级汇编语言基础
  8. mysql5.5安装
  9. IT职场人生系列之二十二:如何学习新语言(二)
  10. date string 转化为weekday