hdu 5653 Bomber Man wants to bomb an Array dp
来源:互联网 发布:程序员都用什么浏览器 编辑:程序博客网 时间:2024/05/15 00:48
问题描述
给一个长度为 N 的一维格子和一些炸弹的位置,请你计算 “最大总破坏指数”。每个炸弹都有向左和向右的破坏力,如果一个炸弹向左和向右的破坏力分别为 L 和 R,那么该炸弹将炸毁 L+R+1 个格子(左边L个,炸弹所在格子,右边R个)。破坏指数的计算方式为:所有炸弹炸毁的格子数的乘积。假设第 i 个炸弹炸毁了 Xi个格子,那么总破坏指数就是 X1∗X2∗....Xm。现在告诉你每个炸弹的位置,你需要计算 最大的总破坏指数,注意:每个格子最多只允许被炸一次。
输入描述
多组测试数据,第一行为一个整数 T(T≤11)。每组测试数据第一行为两个整数 N,M(1≤N≤2000,1≤M≤N),分别表示格子总数和炸弹总数 。第二行是 M 个互不相同的数表示每个炸弹所在的位置。
输出描述
对于每组测试数据,输出 floor(10^6 * log2(最大破坏指数)) (floor表示向下取整)。
输入样例
210 20 910 30 4 8
输出样例
46438565169925
先不考虑将结果乘以 1e6。 设 dp[i] 为从前 i 个格子的状态可以获得的最大破坏指数。那么我们可以枚举每个炸弹,该炸弹向左延伸的距离和向又延伸的距离。 设第 i 个炸弹破坏区间为 [l, r], 则 dp[r] = dp[l - 1] * log2(r - l + 1)。答案就是 dp[n - 1]。不要忘记最后要向下取整。
#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;int n, m;int pos[2010];double dp[2010];int main(){ int T; scanf("%d", &T); while (T--) { double ans = 0; scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d", &pos[i]); pos[i] ++; } sort(pos + 1, pos + 1 + m); pos[m + 1] = 2005; memset(dp, 0, sizeof(dp)); dp[pos[1]] = log(pos[1]) / log(2); for (int i = pos[1] + 1; i < pos[2]; i++) dp[i] = log(i) / log(2); for (int i = 2; i <= m; i++) for (int j = pos[i - 1]; j < pos[i]; j++) for (int k = pos[i]; k < pos[i + 1]; k++) { dp[k] = max(dp[k], dp[j] + log(k - j) / log(2)); } printf("%I64d\n", (long long)(dp[n] * 1e6)); } return 0;}
0 0
- 【HDU 5653】Bomber Man wants to bomb an Array.|DP
- hdu 5653 Bomber Man wants to bomb an Array dp
- HDU 5653 Bomber Man wants to bomb an Array. dp
- hdoj 5653 Bomber Man wants to bomb an Array. 【dp】
- HDU 5653 Bomber Man wants to bomb an Array.(dp)
- HDU 5653 Bomber Man wants to bomb an Array.(DP问题)
- HDU5653 Bomber Man wants to bomb an Array. DP
- hdu5653 Bomber Man wants to bomb an Array 线性dp
- hdu5653 Bomber Man wants to bomb an Array(dp)
- hdu5653 (dp) Bomber Man wants to bomb an Array
- 【HDOJ 5653】 Bomber Man wants to bomb an Array.(DP)
- hdu5653 Bomber Man wants to bomb an Array.
- BestCoder Round #77 (div.1) Bomber Man wants to bomb an Array. Hdu5653
- 【HDU5653 BestCoder Round 77 (div1) C】【DP 复杂度计算】Bomber Man wants to bomb an Array n炸弹设置爆炸左右界 最大爆炸力的乘积
- Hdu Bomb(数位DP)
- 【数位DP】Bomb HDU
- Hdu-5893 List wants to travel(树链剖分)
- [树链剖分] HDU 5893 List wants to travel
- node.js系统找不到指定文件报错
- 解决Firefox下input button内文字垂直居中
- HDU-1425(sort)
- HDU 3533
- Android从系统图库中选择图片的源代码
- hdu 5653 Bomber Man wants to bomb an Array dp
- 算法笔记之常用查找与排序
- 设置注册局锁以及增加域名安全监控
- JDK容器与并发—List—LinkedList
- BZOJ 3295 动态逆序对(CDQ分治)
- 关于抽象类和接口
- 5.3 postfix的ACL规则
- zz:初学android所必需的的知道的android新闻系统程序基本结构
- c++实验三-个人所得税计算器