摘要:
参考了别人的博客题意:先输入case数,每个case输入n,m,表示有n棵树,要用枪消灭m棵,下面n行给出n棵树的坐标,要求枪的个数最少。DP状态压缩。原理是对于n棵树我们搞一个n位的二进制数,如果第i棵树还没有被消灭,在n位二进制数对应的位上就是1,否则为0。例如有5棵树,若11111,说明5棵树都没有被消灭;10101,说明第2,4棵树已经被消灭了,然后这个二进数再转为十进制,这个十进制数就是一个状态。我们可以真的开辟一个数组b[]来对应保存那些0,1,然后转化为十进制,但是知道原理之后我们利用c语言的位运算直接对十进制操作。那我们要求的目标状态是什么?对于那个n位的二进制数,当1的个数小 阅读全文
摘要:
题意给出一个n*n的方阵,从(1,1)出发到(n,n)目的是找出一条路径,这条路径上的点的值为负数的个数要小于等于k,在满足这个条件之下,使路径之和最大,如果无法找到这样的路径(即负数的个数一定大于k)则输出impossible定义状态为四维,f[i][j][k][v],表示从v方向来到当前的点(i,j),已经用掉的负数的个数是k,所能得到的最大值。V=0表示从上面递归而来的,接下来可以向下,左,右递归。V=1表示从左边递归而来,接下来可以向下,右递归。V=2表示从右边递归而来,接下来可以向下,左递归。然后就是注意初始化的问题和一些值要记得赋初值的问题,整个记忆所搜索的思路还是比较容易理解的# 阅读全文