摘要: f[i][j]表示前i块木板考虑前j个工匠的最大收益,f[i][j]表示的所有方案可分为三种,1.工匠j不涂,可用f[i][j-1]表示 2.工匠j涂了,但不涂第i块木板,可用f[i-1][j]表示 3.工匠j涂了第i块木板,包括j所有可取的左端点 后效性处理:在转移时,工匠应该以s大小排序,如果s 阅读全文
posted @ 2025-07-07 18:22 青一凡 阅读(12) 评论(0) 推荐(0)
摘要: 用f[i][j]表示从s1i点开始组成2^j个s2最短要多长,由于要求"最短" 所以一定以s2的最后一个字符结尾。这样f[i][j] 与f[i+f[i][j]] 拥有可合并性,可以用倍增DP。先预处理f[i][0],状态转移方程为 f[i][j] = f[i][j-1] + f[i+f[i][j-1 阅读全文
posted @ 2025-07-05 17:05 青一凡 阅读(6) 评论(0) 推荐(0)
摘要: int n, m; int x0; int h[100005]; int ga[100005], gb[100005]; int f[20][100005][2]; int da[20][100005][2], db[20][100005][2]; void init_g() { set<pair< 阅读全文
posted @ 2025-07-05 15:16 青一凡 阅读(6) 评论(0) 推荐(0)
摘要: 已知当前树的直径的两个端点为u,v。添加一个节点x,则新的直径一定为(u,v),(u,x),(v,x)中的一条 阅读全文
posted @ 2025-06-07 22:53 青一凡 阅读(20) 评论(0) 推荐(0)
摘要: 求最长乘积为完全平方数的连续子序列。一个数位完全平方数等价于分解质因数后每一个质因数的数量位偶数。先将所有1e6以内的质数哈希,防止出现123==0的情况出现,使异或和为零必须是每个数出现的次数为偶数。 将ai分解质因数,求一个ai->bi的映射,bi定义为ai的哈希后的质因数的异或和。对bi求前缀 阅读全文
posted @ 2025-05-17 22:23 青一凡 阅读(44) 评论(0) 推荐(0)
摘要: 设原状态为st1,st2为st1的子集,可用以下方法遍历st1的子集 for(int st2=(st1-1)& st1 ; st2 ; st2 = (st2 - 1)&st1 ) 阅读全文
posted @ 2025-04-20 18:23 青一凡 阅读(11) 评论(0) 推荐(0)
摘要: 炮兵攻击范围为两格,之枚举两行的状态不够。必须前两行转移给第三行。但这样210*2102^10会超时,去掉每行炮兵与高原冲突的状态,去掉每行可以互相攻击到的状态,剩余状态数<=60满足复杂度。 如果开1e3(210)*(210)的空间会超内存,还得使用滚动数组。对应行数取模3即可。 值得注意的细节, 阅读全文
posted @ 2025-03-28 15:43 青一凡 阅读(18) 评论(0) 推荐(0)
摘要: 这题由于前一个小时会对后一个小时造成影响,所以必须考虑0时是否连续问题。可以在dp时分别令0时为连续与不连续,目标状态就取第n时休息的状态和不休息的状态。 这题必须开滚动数组,否则空间会爆。 using namespace std; // #define int long long #define 阅读全文
posted @ 2025-03-19 22:02 青一凡 阅读(11) 评论(0) 推荐(0)
摘要: 一段dfs序列可看作一颗子树,那么区间DP中的字树合并可以看作两颗字树的合并。两颗子树合并:以其中左边子树的根为根,右边子树作为左边子树的最右边一颗子树。 int f[302][302] = {0}; void solve() { cin >> str; int n = str.size(); st 阅读全文
posted @ 2025-03-14 18:20 青一凡 阅读(16) 评论(0) 推荐(0)
摘要: 2 题解 与排队打水类似,首先可以知道要让饼干数随着g[i]递减而递减。状态定义为前i个人共j个饼干的最小怒气值f[i][j]。 需要注意到当第i人饼干>1时,前i人共同减少一个饼干结果不变。当第i人饼干数=1时,遍历从第k个人开始饼干数都为1. 这样就能覆盖所有饼干分配方案。每一对[i][j]在这 阅读全文
posted @ 2025-03-11 21:40 青一凡 阅读(11) 评论(0) 推荐(0)