CF1152 F. Neko Rules the Catniverse (dp)

题意

一条长为 n 的数轴,可以从任意整点 [1,n] 出发,假设当前在 x ,下一步能到达的点 y 需要满足,y 从未到过,且 1yx+m ,问长恰好为 k 的合法路径条数。

数据范围

对于 F11n105,1kmin(n,12),1m4

对于 F21n109

题解

比较 tricky 的一个题。

考虑我们当前假设经过的路径为 v1,v2,,vp ,我们当前可以添加一个 x<mini=1p{vi} 。显然我们是一定可以添加到队尾的,其次我们可以添加到那些 vix+m 的前面。

那么我们就得到一个很显然的 dp 了,考虑从大到小依次考虑每个数填还是不填就能轻松转移了。

具体来说设 dp[i][j][sta] 为当前在第 i 个位置,路径长度为 j ,最后 m 个位置状压后的状态为 sta

每次转移的时候,如果不填直接转过去,填的话可以转到后 m 个有 1 的状态以及队尾,也就是 1+bitcount(sta)

这样 dp 刚好每条路都能一一对应上。

对于 F1 直接 O(nk2m) 就行了,F2 考虑利用矩阵快速幂优化到 O((k2m)3logn) 。(说实话 F2 没啥意思。。)

代码

#include <bits/stdc++.h> #define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i) #define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i) #define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i) #define Set(a, v) memset(a, v, sizeof(a)) #define Cpy(a, b) memcpy(a, b, sizeof(a)) #define debug(x) cout << #x << ": " << (x) << endl using namespace std; template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; } template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; } inline int read() { int x(0), sgn(1); char ch(getchar()); for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1; for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48); return x * sgn; } void File() { #ifdef zjp_shadow freopen ("F1.in", "r", stdin); freopen ("F1.out", "w", stdout); #endif } const int N = 1e5 + 1e3, K = 14, M = 4, Mod = 1e9 + 7; int dp[N][K][1 << M]; int main() { File(); int n = read(), k = read(), m = read(); dp[0][0][0] = 1; Rep (i, n) For (j, 0, k) Rep (sta, 1 << m) { (dp[i + 1][j][sta >> 1] += dp[i][j][sta])%= Mod; int res = dp[i][j][sta] * (1ll + __builtin_popcount(sta)) % Mod; (dp[i + 1][j + 1][(sta >> 1) | (1 << m - 1)] += res) %= Mod; } int ans = 0; Rep (sta, 1 << m) (ans += dp[n][k][sta]) %= Mod; printf ("%d\n", ans); return 0; }

__EOF__

本文作者zjp_shadow
本文链接https://www.cnblogs.com/zjp-shadow/p/10777887.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zjp_shadow  阅读(535)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示