欢迎光临散文网 会员登陆 & 注册

CF竞赛题目讲解_CF417D(DP+状态压缩+顺序扫描)

2022-09-02 12:53 作者:Clayton_Zhou  | 我要投稿

 https://codeforces.com/problemset/problem/417/D


题意:

一共需要解决m道问题。 每个人需要x元的费用, 又需要y台监视器才答应写题目,每台b元。给出每个人可以解决的题目。

求最少需要多少花费能够解决所有问题。


题解

状态压缩DP。把每个人可以解决的题目集合状态压缩一下。

按需要监视器数量从小到大 排序, 以便顺序扫描。

枚举到第i个人,那么编号≤i的人都满足监视器的要求。监视器的费用可以单独考虑。不用dp。

dp[S]表示解决集合S内所有题目的最小花费,S为一个整数。

初始化为-1,dp[0] = 0。

 状态转移( 假设dp[j]已经知道):

dp[j|p[i].s] = min(dp[j|p[i].s],dp[j] + p[i].x);

 

集合{a,b,c}的所有子集合为:

{a}, {b}, {c},{a,b},{a,c},{b,c},{a,b,c}

对应的二进制数:

1,10,100, 11,101,110,111


如果集合的大小n<32,可以考虑使用状态压缩,

即用一个数i<(1<<n)表示一个子集合。


CF竞赛题目讲解_CF417D(DP+状态压缩+顺序扫描)的评论 (共 条)

分享到微博请遵守国家法律