10月8号

来源:互联网 发布:天天象棋辅助软件 编辑:程序博客网 时间:2024/05/17 04:57
         假期主要干两件事,做树装数组的题和看状态压缩dp的博客,首先树装数组的这几天断断续续A了几道题,吧几道题用到了树装数组好多内容,首先是树装数组的基本操作,单点更新区间查询,还有区级更新单点查询,其中有道题挺有意思,1015题,题意一群牛参加完牛的节日后都有了不同程度的耳聋,第i头牛听见别人的讲话,别人的音量必须大于v[i],当两头牛i,j交流的时候,交流的最小声音为max{v[i],v[j]}*他们之间的距离,现在有n头牛,求他们之间两两交流最少要的音量和。这道题实在是想不明白是怎么用树状数组,问了问双智才明白先按听力值从小到大排个序,保证当前的牛与前面的联系时,取当前牛的听力值,再用两个树状数组,一个记录所有所有坐标点的位置个数,这样就可以查询大于当前坐标的个数和小于当前坐标的个数,另一个记录所有坐标点的和,这样就可以查询小于和大于当前坐标的所有坐标的和,最后用当前听力值*(大于当前坐标的坐标和—大于当前坐标的个数*当前坐标+小于于当前坐标的个数*当前坐标—小于当前坐标的坐标和)很多树装数组的题真是藏的很深啊,其次做了一道倒序输入的题也是很难想明白的。最后是一道是1002题,问你不降子序列的个数。用到树状数组+离散化,设dp[i]为前i个并且以i结尾的的不降子序列个数。 我们知道前面凡是小于等于a[i]的都可以到dp[i],所以dp[i]+=dp[j](a[j]<=a[i]&&j<i),原来树装数组也可以用来dp啊状态压缩dp看了几道题,感觉这些题都特别有意思,首先是Pebbles这道题,给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取!这道题我这么想的先状态压缩,将矩阵看作二进制变成一个数,再以第1行为例枚举出所有的情况与最优解,存在v,f数组,再更新下面2~n行,枚举过程中判断异或一下上、上左、上右有没有选过即可。然后看博客,发现好多种解法好多优化有枚举有效状态的还有单层dfs回溯构造法来做而不是用枚举所有有效状态来做的还有双层回溯滚动数组+状态压缩DP的但最后一种做法我没太看懂,不明白数据是如何双层回溯的哭。然后是Unlock the Cell Phone这个题,一个触屏机的解锁系统,问你有多少种方案。 原来可以任意角度进行滑行,不过不能跳过没按的,简单的来说就是经过所有要按的点,然后要满足这个点是否有一条路线到达这个点,就是这里感觉处理异常困难,分析一下,走过的点可以跳过,那就是按了后还是可以经过的,那么不能经过的点有哪些呢?首先标记为1的点不能经过,为0且没有经过的点,其他点都可以经过。但这道题要先预处理了一下。还有一道大难题Bugs Integrated, Inc,现在给你一个N*M的矩阵,然后矩阵有K个坏了的格子,矩阵中黑格子表示坏的格子,要你在所有好的格子中选出尽量多的2*3(或3*2)小矩阵,问你最多能选多少个这样的小矩阵。这个题是真心难,看了一天多才弄明白是个啥事,主体的思想还是用三进制表达当前状态然后由递归的方法寻找最优解,而且还用了滚动数组两只来表示当前行和前一行的状态。具体实现还是看大牛的代码吧,要是比赛的话,真是够呛能写出来的。
原创粉丝点击