上一页 1 ··· 5 6 7 8 9 10 11 12 13 下一页
摘要: 题意:如下图所示,给出n*m的网格,其中P表示能放炮兵,H表示不能放,每只炮兵的射程如图涂黑部分。在防止误伤的前提下(任何一个炮兵不在其他炮兵的射程内),问最多能拜访多少炮兵。(n 7 #include 8 #include 9 #include 10 11 using namespace std; 12 13 #define CLR(x) memset(x, 0, sizeof(x)) 14 #define PB push_back 15 16 int n, m, sz; 17 bool a[200][20]; 18 int d[105][70][70]; 19 vect... 阅读全文
posted @ 2013-11-23 00:46 Plumrain 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 题意:用1*2的瓷砖拼出m*n的矩形。问有多少种拼法。解法:设d[i][j]表示第i行状态为j的情况下,最多能有多少种拼法,对于状态j,1表示为竖着放置的瓷砖且它横跨i和i+1两行,其余皆用0表示。d[i][j] += d[i-1][k],其中k表示能转移到j的状态。tag:状压dp 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-11-19 01:01 4 * File Name: DP-POJ-2411.cpp 5 */ 6 #include 7 #include 8 #include 9 #include 10 11 u... 阅读全文
posted @ 2013-11-23 00:31 Plumrain 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题意:在m*n的矩阵上,1表示能放牛,0表示不能放。要求放的牛不能相邻(上下相邻或者左右相领),问放牛的方法种数。解法:设d[i][j]表示第i行状态为j的情况下,能放的牛的数量。d[i][j] += d[i-1][k],其中k表示能转移到j的状态,num(j)表示状态为j的行所放的牛的数量。当然,还要判断一下状态j是不是能放在第i行。tag:状压dp 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-11-18 23:37 4 * File Name: DP-POJ-3254.cpp 5 */ 6 #include 7 #incl... 阅读全文
posted @ 2013-11-23 00:22 Plumrain 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 题意:娱乐场里面的那种打鼹鼠的游戏机。如下图。在n*n的游戏机上,每个整点都可能出现鼹鼠,鼹鼠分为m批出现。每一批鼹鼠出现的时候,如果锤子在点(i,j),则锤子可以移动到以(i,j)为圆心,d为半径的圆内任何一个整点,且移动路径(包括首尾)上的所有鼹鼠都会被打。(注意,锤子可以移动出游戏机的范围)。初始时,锤子可以在任何点,给定n,m,d和所有鼹鼠出现的时间和位置,问所有鼹鼠都出现之后,最多能打到多少鼹鼠。解法:就是一个普通的dp,设d[i][j][k]表示第i批鼹鼠出现后,锤子停留在(j,k)的情况下,能打到最多的鼹鼠数量。 状态转移方程为if(ok(j, k, x1, y1) d[i].. 阅读全文
posted @ 2013-11-22 15:14 Plumrain 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 题意:如下图所示,蜘蛛侠在某个位置,他女朋友在另一个建筑(WestTower)上,蜘蛛侠每次可以吐丝到附近的建筑顶端,然后摇摆到关于该建筑物对称的位置。只要荡到横坐标 >= X(WestTower)的位置,就能爬上WestTower。问在不碰到地的情况下,最少要吐多少次丝。解法:由于蜘蛛侠的纵坐标始终没变所以不需要记录纵坐标。对于每个建筑物,由于不能碰地所以只有一定的范围内能够吐丝到该建筑物并且移动,对每个建筑物,设这个范围为(l[i], r[i])。(l[i]和r[i]易求) 设d[j]表示到达横坐标j所需要最少次数。枚举每个建筑物i,d[j] = min(d[j-k] + 1)(l[ 阅读全文
posted @ 2013-11-22 14:15 Plumrain 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 题意:如下图,有一种n*m的网格,每个格子里可能分别有两种矿物a[i][j]和b[i][j],在网格的上边和左边分别有这两种矿物的收集站。对每个网格,可以建立向上或者向左的传送带,将该格所有矿物传送。但是,传送带不能变方向,否则变方向之前的矿物会从传送带上掉落下来。比如,矿物如果从(i,j)传送到(i,j-1),再传送到(i-1,j-1),就会掉落。问最终能收集到的矿物最多为多少(两种矿物数量之和)。解法:首先,对于第(i,j)格,如果它向左传送,则应该让(i,0), (i,1)...(i,j-1)都向左传送。向上同理。 设d[i][j][0]表示第(i, j)格向左传送的情况下,矩形(0.. 阅读全文
posted @ 2013-11-22 13:52 Plumrain 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 装载自http://blog.csdn.net/tianshuai1111/article/details/7652553一,概述 priority_queue是拥有权值观念的queue,它允许加入新元素,移除旧元素。调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。但它是一个queue所以只允许在底端加入元素,在顶端移除元素。 排序:按照权值大小顺序排序,而不是按照push 进去的顺序排序。权值高者排在前面,权值低者排在后面。 允许以任何大小顺序插入到优先队列,但取出时是按照权值大小取。 二,heap(堆)... 阅读全文
posted @ 2013-11-21 16:34 Plumrain 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 题意:在w*h(最大100*100)的棋盘上,有的格子中放有一棵树,有的没有。问s*t的小矩形,最多能含有多少棵树。解法:最直接的想法,设d[x1][y1][x2][y2]表示选择以(x1, y1)为左下角,以(x2, y2)为右上角的矩形含有多少棵树。然后就可以很容易地递推了。可是空间复杂度为O(10^8)不能被接受。 又发现d[x1][y1][x2][y2] = d[1][1][x2][y2] - d[1][1][x1-1][y2] - d[1][1][x2][y1-1] + d[1][1][x1-1][y1-1],所以只需要预处理出所有的d[1][1][i][j]即可,然后每次求出一.. 阅读全文
posted @ 2013-11-18 15:41 Plumrain 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个完全由小写字母组成的字符串s,对每个字母比如x(或a,b,c...z),在字符串中添加或者删除它分别需要花费c1['x']和c2['x']的代价,问将给定字符串变成回文串所需要的最少代价为多少。解法:设d[i][j]表示将字符串中从第i位至第j位变成回文串所需要的代价。若s[i] == s[j],d[i][j] = d[i+1][j-1];否则的话,有四种处理方法。 对xa.......by,可以将其变为xa......b,yxa.....by,a.......by,xa.....byx中的任意一种再处理。所以d[i][j] = min(d[i][ 阅读全文
posted @ 2013-11-18 15:32 Plumrain 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题意:中文题,感觉没什么好翻译的。http://poj.org/problem?id=1191解法:将均方差公式变形,用ave表示平均值,均方差 = (∑xi*xi - 2 * ave *∑xi + n * ave * ave) / n = (∑xi*xi -n*ave*ave)/n。由于平均数一定,所以只需要使平方之和最小即可。 设s[x1][y1][x2][y2]表示以(x1, y1)为左上角,以(x2, y2)为右下角的矩形里,所有小格的数之和的平方。d[t][x1][y1][x2][y2]表示切t刀,以(x1, y1)为左上角,以(x2, y2)为右下角的矩形所能参生的最小平方和是.. 阅读全文
posted @ 2013-11-17 20:28 Plumrain 阅读(273) 评论(4) 推荐(0) 编辑
上一页 1 ··· 5 6 7 8 9 10 11 12 13 下一页