【每日一题】33. 简单瞎搞题 (滚动数组 + bitset 优化DP)

补题链接:Here

这个问题的难点在于如何统计出所有和可能出现的情况,并且不能重复。
很容易想到用桶去存储每一个数,即某个和能够组合出来则为1,否则为0

不妨令 dp[i][j] 表示为第 i 次选择时,和为 j 的情况是否出现过

但是内存方面需要 1e8int 内存,显然是不可接受的

那么我们考虑用 bitset 优化内存,由递推方程:dpi=dpi|=(dpi1<<(jj))

代表第 i 次选择的时候是否能从当前状态转移到和为j 的状态

const int N = 110;
bitset<1000010>dp[N];
void solve() {
	int n; cin >> n;
	dp[0] = 1;
	for (int i = 1, l, r; i <= n; ++i) {
		cin >> l >> r;
		for (int j = l; j <= r; ++j)dp[i] |= (dp[i - 1] << (j * j));
	}
	cout << dp[n].count() << "\n";
}

写完状态转移方程发现 dpi 仅与 dpi1 有关系,所以由滚动数组来节省空间

bitset<1000010> now, nxt;
void solve() {
	int n; cin >> n;
	now[0] = 1;
	for (int i = 1, l, r; i <= n; ++i) {
		cin >> l >> r;
		for (int j = l; j <= r; ++j)
			if (j == l)nxt = (now << (j * j));
			else nxt |= (now << (j * j));
		now = nxt;
	}
	cout << now.count() << "\n";
}
posted @   RioTian  阅读(64)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
历史上的今天:
2020-05-25 读入、输出优化
2020-05-25 UVA - 12096 :The SetStack Computer
点击右上角即可分享
微信分享提示