2017年12月10日训练总结

这次训练总结是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         {
            for(k=(i+1)|i;k             {
            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!

你可能感兴趣的:(训练日记,状态压缩dp)