这次训练总结是12月8日到12月10日。
状压DP专题今天就结束了。目前是22/26,本来是打算做完24题的。。。看来是完不成了。今晚还准备把其中一道AC自动机+状压DP的题目做出来(看的资料里有这道题),这道题的思路十分巧妙,把五维数组巧妙地压缩成了二维,是另一种压缩状态的方法。具体的等做出来再说吧。。。
总结一下状压DP:
刚开始以为就是利用二进制压缩状态,01表示有无,后来发现它其实是一种方法,二进制压缩只属于其中的一种。不过二进制压缩的确非常好用,也是巧妙地利用了位运算。
解决的题目主要是状态数比较少,但是无法开那么大的数组的问题。
可以直接用几重for循环完成状态转移,也可以利用dfs。但是用dfs做了放木块的题目以后,几乎再也没遇到用dfs来状态转移的题目。而且自己做放1*3的木块的时候还爆了一次内存。。。有些题目需要预处理合法的状态,有些题目需要先求出最短路,有的题目要用浮点数,有的题目需要求一个数二进制状态所含1的数目,贴一段觉得比较不错的代码:
int fcount(int x)
{
int s=0;
while(x){
s++;
x&=(x-1);
}
return s;
}
有的题目需要控制精度,有的题目
另外,还学会了string可以直接加字母,学会了滚动数组i&1,学会了用异或^,这里贴上删回文数删到完那道题的状态转移的代码:
for(i=0;i<m;i++)
{
for(k=(i+1)|i;k<m;k=(k+1)|i)//k状态一定包含i状态
{
if (b[k^i]&&dp[i]!=-1)//k^i 就是删除的那个串
{if (dp[k]<0)dp[k]=dp[i]+1;
else dp[k]=min(dp[k],dp[i]+1);
}
}
}
连连看的状态比较奇特,用10个二进制位表示当前的位置到接下来连续10个水果的状态,1为已经消除,0为未消除。然后二进制最后一位表示当前水果状态,然后看看能不能删到完。
另外,还有两道期望dp(跑去看了资料,简单的学习了下),两道AC自动机+状压DP,目前只做出了一道,同时自己用这几天的时间主攻了AC自动机,基本应用基本解决,再多做几道题巩固一下,写几道题解。
接下来这几天主要做一些AC自动机的题目巩固学习一下,下一个专题暂定概率dp和期望dp,插头dp看了一些资料没怎么看懂,可能看完AC自动机直接看后缀数组。
另外,数位dp没有白学,今天的比赛D题几乎是数位DP专题中数字计数的原题。。。B题也很快做出来了,最坑的是A题读错题了。。没做出来。。。懂题意后秒A。。。亏死了!!!读题还是大问题。。。
加油!!!enjoy my ACM life!