当前位置: 首页 > news >正文

子序列dp略解

打 ABC 遇到的一类题型,感觉相似性还挺大的,遂整理。

子序列 dp,即统计一类子序列的数量,要求不重复并满足题目中的限制条件。

暴力统计通常是 \(O(N ^ 2)\) 的可以通过 前缀和优化 达到 \(O(N)\)。但这不是难点所在。

这类 dp 有一个非常重要的前置贪心。为了保证我们统计的子序列不重复,我们人为规定需要的数字要尽早拿走,这样就可以确保对于一个数组,我们想取的一种子序列有且只有一种取法。

比如数组 (1, 2, 3, 2),如果我们想取子序列 (1, 2),通过我们的人为规定,唯一合法的就是拿下标为 1 和 2 的数,拿下标为 1 和 4 的数字是不合法的。

了解这个前置知识就可以看模板题了。

模板题 Leetcode 940. 不同的子序列 II

public:int distinctSubseqII(string s) {const int mod = 1e9 + 7;int n = s.size();s = "$" + s;    vector<long long> dp(n + 1, 0), sum(n + 1, 0);vector<int> pos(27, 0);dp[0] = sum[0] = 1;for(int i = 1; i <= n; ++i) {if(pos[s[i] - 'a'] == 0) {dp[i] = sum[i - 1];}else {dp[i] = (sum[i - 1] - sum[pos[s[i] - 'a'] - 1] + mod) % mod;}sum[i] = (sum[i - 1] + dp[i]) % mod;pos[s[i] - 'a'] = i;}return (int)(sum[n] - 1 + mod) % mod;}
};

\(dp_i\) 代表以 \(a_i\) 结尾的合法子序列的个数。更平常的说,代表的是依据我们之前看见一个拿一个的贪心策略,以 \(a_i\) 结尾的子序列数量。

考虑如何转移。如果转移的位置在上一个与 \(a_i\) 相等的数字之前,那么就违反了见一个拿一个的策略。因此答案应该是 \(\sum _{j = lst} ^ {i - 1} dp_j\)\(lst\) 代表上一个 \(a_i\) 的位置。在更新的时候顺便维护前缀和即可。

ABC 446G

这个其实差不多,两个变化的地方,一个是不允许连续相同块出现,一个是每次必须要组成一个块。所以对于 \(a_i\) 答案变成了第 \(i - a_i\) 个和第 \(i - a_i + 1\)\(a_i\) 之间的 \(dp\) 和。由于不允许连续,实现的时候要把左边界往后挪一位。

#include <bits/stdc++.h>
#define pb(x) push_back(x)
#define int long long
#define ull unsigned long long
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define rep_(i, a, b) for(int i = a; i >= b; --i)
using namespace std;
namespace FYH {constexpr int N = 5e5 + 5, mod = 998244353;int n, x;void main() {cin >> n;vector<int> dp(n + 1, 0), sum(n + 1, 0), cnt(n + 1, 0);vector<vector<int>> pos(n + 1);dp[0] = sum[0] = 1;rep(i, 1, n) {cin >> x;if(x > n) {continue;}pos[x].push_back(i);cnt[x]++;if(cnt[x] > x) {dp[i] = (sum[pos[x][cnt[x] - x] - 1] - sum[pos[x][cnt[x] - x - 1]] + mod) % mod;}else if(cnt[x] == x) {dp[i] = sum[pos[x][0] - 1];}sum[i] = (sum[i - 1] + dp[i]) % mod;}cout << (sum[n] - 1 + mod) % mod;}
}
signed main() {ios :: sync_with_stdio(0), cin.tie(0);int t = 1;while(t--) {FYH :: main();}return 0;
}
http://www.jsqmd.com/news/411856/

相关文章:

  • 终于!有人总结了大模型学习资料!看完这篇就足够了!
  • 2026设备管理与售后系统推荐,冠唐精准适配企业数字化需求 - 深度智识库
  • 2026无尘投料站行业:哪些企业产品更受欢迎,混合机/试验筛/Z型斗提机/真空上料机,无尘投料站公司推荐榜单 - 品牌推荐师
  • 2026年市面上整形机供应商哪家好?这些值得关注!电子压床/粉末压机/伺服油压机/伺服电子压力机,整形机厂家哪个好 - 品牌推荐师
  • 2026年如何选激素类试剂盒供应商?这些要点需掌握,his elisa试剂盒/试剂盒/人试剂盒,激素类试剂盒厂家推荐 - 品牌推荐师
  • 2026年口碑不错的数字化运营系统大集合,价值共享电商零售/全流程数字化运营,数字化运营系统推荐排行 - 品牌推荐师
  • 【2026最新】大模型学习路线:这会是你见过最全最新的大模型学习路线
  • 2026漯河全屋定制装修推荐 吉美森靠谱口碑,服务源汇郾城召陵舞阳临颍 - 品牌智鉴榜
  • 石家庄自闭症康复机构全攻略:解锁“星星孩子”的成长密码 - 品牌测评鉴赏家
  • Java版智慧场馆运营管理系统源码-无感进出场颠覆传统运营
  • 【大模型学习路线】2026最新大模型技术学习路线:从入门到精通,一篇文章全掌握!
  • 江苏2026年SolidWorks培训口碑机构,挑选攻略来啦,三坐标培训,SolidWorks培训机构口碑排行 - 品牌推荐师
  • 会计面试
  • 2026年热门金相显微镜源头厂家,哪款更适合你?金相切割机/便携式硬度计/Q-80Z金相切割机,金相显微镜公司找哪家 - 品牌推荐师
  • 外贸人必读!2026深圳货代Top5榜单出炉,特货合规出海就看这几家 - 深度智识库
  • 智慧之选:2026年如何筛选合适的圣女果选果机供应商,AI无损测糖分选机/冬枣分选机/智能无损分选机,选果机生产商排行 - 品牌推荐师
  • 2026最新十大知名木纹板材品牌推荐榜!优质环保品质与高性价比源头厂家选择指南,优质专业榜单出炉 - 十大品牌榜
  • 有全世界统一使用汉语的一天吗?
  • 比特浏览器详解
  • 从零到全栈:五大低代码平台如何破解企业转型“不可能三角”?
  • 音潮:当AI开始理解音乐里的情感,而不是只有音符
  • 2026 最新 OpenClaw 服务器部署全路线:源码编译与云端一键方案(附避坑指南)
  • 2026年高密度硅酸钙管托优选厂家,直销品质值得选,汽车后视镜热弯模具/硅酸钙保温板,高密度硅酸钙管托供应商推荐排行榜单 - 品牌推荐师
  • 谱乐AI:当音乐创作变成从“灵感”到“收益”的完整闭环
  • 2026企业AIPPT私有化部署解决方案评估报告:AI原生架构如何成为企业级首选 - 速递信息
  • 不是入门筛法
  • 17寸轮毂装不下大卡钳?RF RACER用“内油路+紧凑设计”给出了答案 - RF_RACER
  • Mastercam许可证文件位置及备份指南
  • JAVA WEB学习12
  • 避坑+指南|2026专业自闭症康复机构权威推荐,家长再也不用踩雷! - 品牌测评鉴赏家