zy-题目总结
2016-05-22 17:55
239 查看
poj1185
状态压缩DP题目大意
n*m的地图,由’H’或P组成。’P’则可以在上面放炮弹,炮弹可以攻击到上下左右各两个方格的位置。在防止误伤的情况下,求最大放置的炮弹数。
这种问题,一个很重要的处理(优化)在于首先用dfs把每一行的可行状态给先给预处理出来,并且计算出这个状态的1的个数防止后面重复计算。对于第i行,我们把所有的状态放在s[i][j]中。
每一行的状态受到前两行的状态的影响。f[i][j][k]表示第i行为状态s[i][j],第(i-1)行状态为s[i-1][k]的最大导弹数。 f[ i ] [ s ] [ t ] = max ( f [ i ] [ s ] [ t ] , f [ i - 1 ] [ t ] [ k ] + count ( a[i][j] ) )。最后,第一维可以滚动。
poj2482
扫描线+离散化+线段树题目描述是一段冗长的情书。题意不复杂,在一个平面内有N个星星,每个星星都在一个亮度值,用一个W*H的矩形去围这些星星,(边上的不算) 求能得到的最大亮度值。
本题和poj1981类似,每个星星的影响范围落在(x,y)->(x+w-1,y+h-1)里,有权值val。所以我们可以用一条平行于y方向的线去扫描过去,到x的时候就把y方向上的(y,y+h-1)加上val,到x+w-1的时候再把这个干掉(相当于加上(-val)即可)。由于星星不多而方格较大,需要对y方向进行离散化。在y方向上的线段树的结点存放的是这个纵坐标被离散化后的代表数。STL的unique在离散化的时候好用。
分成两段来匹配
题意是有一个n长的字符串和m个猜测,接下去有m行,每行有两个输入,一个是n长的字符串,一个是整数s,表示某一轮猜测的字符串以及与原n长字符串相比正确的位数,问存在多少个n长的字符串,使得所有猜测成立。(n<=35,m<=10)n<=35,所以不能直接暴力,但是这个题目给了另外一个比较水的条件,就是每个s<=5,所以一个方法是可以直接枚举和第一个匹配的字符串,共有35C6种可能,不会超时。此外,也可以分成两段来算,先穷举出前n/2的所有可能,计算出其和m个字符串的匹配数,放到vector里,然后再放到一个map里面,val的值+1。枚举后一半,每个vector存的值是s[i]-匹配数,最后结构加上map里的这个vector的值就可以了。时间复杂度大概是o(n*m*2^(n/2))。//感觉和平方分割那种思想有些类似的意思
一些注意点
注意一下实数类型的输出,%f,%lf,以及强制转化时的括号等等之类的(poj的g++与c++提交有时会一个WA一个AC,所以实在找不到错误就换个方式交一下)初始化!头脑不清醒的时候还是建议开全局变量,毕竟初始值为0可能会逃过一些问题。另外局部变量能开的大小也比全局要小。
边界问题,在提交前注意一些比较小但比较特殊的情形,可能事半功倍。
有一些题目的数据可能会多一些空行空格之类的,用cin>>ch是个不错的选择。
相关文章推荐
- 算法——Reverse Integer
- hd1000
- 开始刷LeetCode
- LeetCode刷题记
- 小程序员刷题之路_1
- google笔试题:写出这样一个函数 ,输入一个 n, 输出从1到这个数字之间的出现的1的个数
- LintCode 螺旋矩阵 (新解法)
- C++刷题——括号配对问题
- Codeforces Round #345 (Div 2)
- 【bzoj3223】Tyvj 1729 文艺平衡树
- 【spoj2774】最长公共子串
- 【bzoj3998】[TJOI2015]弦论
- 【bzoj3261】最大异或和
- 【bzoj1901】Zju2112 Dynamic Rankings
- 【bzoj1146】[CTSC2008]网络管理Network
- 【bzoj2733】[HNOI2012]永无乡
- 【bzoj1500】[NOI2005]维修数列
- 【bzoj1588】[HNOI2002]营业额统计
- 【bzoj1030】[JSOI2007]文本生成器
- 【bzoj2882】工艺