2.17状压dp有关考试总结

  • 前言:
    该考试主要是对于寒假所学习的内容所进行的考试
    寒假所学习的内容主要是dp 字符串相关(hash kmp
    而此次考试则侧重于考察寒假所学的dp内容 包括但不只包括:
    区间dp,状压dp,树形dp,单调队列优化dp等

- 考试内容分析

t1 音量调节

给定初始值 在不超过最大值且不小于0的前提下,将初值加上或减去每个读入的数,使结果最大,若定会超过最大值或小于0,则输出-1

分析:感觉是dp 求最大值很有dp那味。
但是感觉 总体最大值无法通过局部最大值导出 在推状态转移方程的时候无法射出状态或者表示出很好的方程 耗费了相当一部分时间。
遂去写t2 在完成t2后决定t1写暴力分 用了dfs+符合题意的简单剪枝 最后得分64,在极短的代码书写和调试时间内 算是很让人满意的得分了。

t2 配对

一个棋盘 同一行或同一列只能取1个格子,同时,有的格子不能取 最后一共有多少种取法。

分析:棋盘最大是21 啧啧啧 状压的味道明显的不能更明显了。
状压思路是f [ i ] [ j ] 表示当前已到第i行 状态为j。
但是有个小问题 long long f[25][(1<<21)]貌似会爆空间。
所以用了一个小技巧 只开f[2][(1<<21)],状态转移时用f[i&1]与f[(i-1)&1]进行转移 后将f[(i-1)&1]清空。
这个题思路出的极快 小数据代码完成极快(或者说较暴力的代码 )。
我开出一个vector 记录一个状态中的1有i个时所有可能的状态cnt[i] 然后将cnt[i]与cnt[i-1]双层循环进行转移 最外层是行数i。
看似很对是不是 看似很正确是不是!
所以我在大数据的时候遇到了问题 发现答案不输出 我加上打表后发现并非死循环而是打表跳动极为缓慢 遂打表cnt[i] 发现中间的数大概有2*1e6左右。
哦 那没事了告辞。
遂写优化 重构状态转移 由直接暴力枚举改为枚举位置(1-12)进行填充 判断是否能填入状态内进行转移 遂过 ac。
但是我这个写法用时较长 有一部分原因是该题有2s 不清楚有些ac大佬的短时代码怎么写的。

t3 补兵

t组数据 每组数据n个数 这n个数每s会减小1,同时 在每s 你可以使一个数额外减小1 问你最多能使几个数从1变为0

我不会 真的没推出来式子 有点像dp 还有点数学的感觉 。耗费大量脑力思考遂写了一个也许有点道理的数学计算 最后得分10(感谢数据)。

t4 蜘蛛棋盘

一个棋盘 要求通过放置十字形格子铺满棋盘 格子可重叠 可不规则放置在边缘 求总格子数-十字形格子的最大值(最少放置多少块十字形格子)

一眼状压dp
根据小数据先写了部分分 (数学计算)
根据n*m<40 显然可进行dp m,n的交换对结果无影响 但是我推不出状态转移方程。
得分30
后来听说可以手推答案后数组记录 以及用类似开关的思路验证做 状压该题比较不好写…

t5 奶牛大聚会

基本上是树形dp裸题 求树上一个点到其他店的距离之和最小

只要看出来真的裸题 代码和调试都很快 ac。

最后得分 64+100+10+30+100=304,总体而言没犯低级错误 考试的时候心态还算不错 考试中代码优化重构基本顺利 发挥出了正常水平。

你可能感兴趣的:(考试)