题目大意:给你一个有$n$个盘子的汉诺塔状态$S$,问有多少种不同的操作方法,使得可以在$m$步以内到达状态$T$。$n,m\leqslant100$

题解:首先可以知道的是,一个状态最多可以转移到其他的$3$个状态,然后发现若$m\leqslant100$的话,每个柱子最多移动$7$个盘子,所以最多状态只有$3^{21}$次,这个数可能有点大,但是通过更严密的分析的话,最后状态数只有$10^5$级别,可以通过记忆化搜索通过。

卡点:妈啊,我怎么又把柱子上的顺序弄反了

C++ Code:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
const int mod = 998244353;
inline void reduce(int &x) { x += x >> 31 & mod; } int n, m, ans;
std::vector<int> S, T, v[3];
std::map<std::vector<int>, int> f[105];
int dfs(int x, std::vector<int> S, std::vector<int> *v) {
if (f[x].count(S)) return f[x][S];
if (!x) return 0;
int &F = f[x][S];
for (int i = 0; i < 3; ++i) if (v[i].size())
for (int j = 0; j < 3; ++j)
if (!v[j].size() || v[i].back() < v[j].back()) {
S[v[i].back()] = j;
v[j].push_back(v[i].back()), v[i].pop_back();
reduce(F += dfs(x - 1, S, v) - mod);
S[v[j].back()] = i;
v[i].push_back(v[j].back()), v[j].pop_back();
}
return F;
}
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> m;
for (int i = 0, x; i < n; ++i) std::cin >> x, S.push_back(--x);
for (int i = 0, x; i < n; ++i) std::cin >> x, T.push_back(--x);
for (int i = n - 1; ~i; --i) v[T[i]].push_back(i);
f[0][S] = 1;
for (int i = 0; i <= m; ++i) reduce(ans += dfs(i, T, v) - mod);
std::cout << ans << '\n';
return 0;
}

  

最新文章

  1. Linux Socket编程(不限Linux)【转】
  2. ROS学习笔记(八)——ROSTOPIC
  3. 【nginx网站性能优化篇(3)】反向代理实现负载均衡
  4. MembershipProvider的Initialize
  5. 10款无限滚动自动翻页jquery插件
  6. UVA 753 - A Plug for UNIX(网络流)
  7. 【线段树】HDU 5493 Queue (2015 ACM/ICPC Asia Regional Hefei Online)
  8. github 预览html
  9. 可以让javascript加快的脚本(收藏了)
  10. 2014/4月金山WPS笔试
  11. LeetCode——Valid Sudoku
  12. DFB系列 之 Flip()更新buffe
  13. CentOS 7修改网卡名称
  14. UGUI中UI与模型混合显示
  15. layer弹窗和日期
  16. 外部调用mvc的api方法时,如何解决跨域请求问题?
  17. [转]MSSQL中利用TOP提高IF EXISTS查询语句的性能
  18. COM组件没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
  19. [Database] Redis 随笔
  20. Android SDK Manager检查更新时遇到Failed to fetch URL xxxxxxx reason: Connection to xxxxxx的错误的解决办法!

热门文章

  1. 金字塔原理(Pyramid Principle)
  2. SQL基础-子查询&amp;EXISTS&amp;UNION
  3. Eclipse Maven问题小记
  4. Postgresql 数据库迁移步骤
  5. 卷积神经网络CNN学习笔记
  6. centos7---mysql5.7主从复制读写分离
  7. Net core学习系列(一)——Net Core介绍
  8. 【mybatis源码学习】ResultMap查询结果映射
  9. uploadifive 1.1.2 动态传参
  10. firewall防火墙常用操作