合并集合
裸的石子合并,双指针扫一遍记录一下每个区间内不同数字的个数,然后区间dp就可以了
ZYB建围墙
六边形可以围出的面积最大,然后考虑大于当前房子数的最小六边形(可以直接算,也可以二分),然后考虑将某几面的强向里面移动就可了
ZYB和售货机
将当前节点的最优和次优方案记录下来,然后按最优的建图,如果图中没有环,那么,我们可以直接把这些位置的收益计算出来,否则,对于环上的所有点,其中有一个必须以次低价买入。统计一下这样的亏损,取最小即可。
ZYB玩字符串
神奇的DP;
dp[i][j]表示前从i到j有(j-i)%len位和p串的前(j-i)%len位匹配,剩下的位数可以消去,是否可行
首先,考虑一个合法的解长什么样子,肯定有
1. s[l] == s[0] && s[n-1] == s[r]
2. cnt[ch-'a'] && cnt[ch-'a'] % num[ch-'a'] == 0
3. cnt[ch-'a'] && cnt[ch-'a'] / num[ch-'a'] == n / len
(cnt表示某一个字母在原串中出现的次数,num表示某一个字母在p串中出现的次数)
考虑加入一位,有两种方法
- 作为前缀和后面的匹配
f[i][j]|=f[i][j-1]&(s[j]==now[(j-i)%len]);
- 和前面的一段组合成一个完整段
f[i][j]|=f[i][j-k*len]&f[j-k*len+1][j];
题目要求求字典序最小,建议用string