博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU5653 Bomber Man wants to bomb an Array 简单DP
阅读量:5139 次
发布时间:2019-06-13

本文共 1094 字,大约阅读时间需要 3 分钟。

题意:bc 77 div1 1003(中文题面)

分析:先不考虑将结果乘以 1e6。 设 dp[i] 为从前 i 个格子的状态可以获得的最大破坏指数。

那么我们可以枚举每个炸弹,该炸弹向左延伸的距离和向又延伸的距离。

设第 i 个炸弹破坏区间为 [l, r], 则 dp[r] = dp[l - 1] + log2(r - l + 1)。答案就是 dp[n - 1]。不要忘记最后要向下取整。

 

注:我对官方题解稍作解释,dp[i]代表前i个格子可以获得的最大破坏指数

但是更新的时候,需要注意,假设有 n 个炸弹,第 i 个炸弹的位置是o[i]

那么考虑处理到第i个炸弹,他能更新的dp[j]是有限制的,o[i]<=j<o[i+1],因为一个炸弹的爆炸区域不可能跨过另外一个炸弹

更新dp[j]的也dp[k]也是有限制的,o[i-1]<=k<=o[i],道理是一样的

然后看起来是三重循环,实际上很小

然后有一个小优化,事先把log2(1-2000)打出来,因为这个函数很慢

 

#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int N=2e3+5;const int INF=0x3f3f3f3f;int o[N];double dp[N],val[N];int main(){ for(int i=1;i<=2001;++i) val[i]=log(i)/log(2); int T; scanf("%d",&T); while(T--){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;++i) scanf("%d",&o[i]),++o[i]; sort(o+1,o+1+m); memset(dp,0,sizeof(dp)); int c=m>1?o[2]:n+1; for(int i=o[1];i
=o[i];--j) for(int k=o[i-1];k
View Code

 

转载于:https://www.cnblogs.com/shuguangzw/p/5324511.html

你可能感兴趣的文章
1.9 Android
查看>>
分布式系统中接口的幂等性(转)
查看>>
c语言第三次博客作业
查看>>
mybatis 乐观锁和逻辑删除
查看>>
PAT 1055. 集体照 (25)
查看>>
python(wordcloud)实现中文词云
查看>>
JQuery AJAX请求分类示例
查看>>
Python Numpy数组保存
查看>>
同一个中断正在执行中还会重入么
查看>>
2.Struts2的Action接口和 ActionSuppor类
查看>>
使IE6、IE7、IE8支持CSS3代码方法
查看>>
codereviw得到的一些经验
查看>>
TreeSet介绍
查看>>
MVC4 下DropDownList使用方法
查看>>
tomcat war包自动化部署脚本
查看>>
502 bad gateway 错误
查看>>
day20 BBS前奏
查看>>
常见JS写法
查看>>
numpy的计算
查看>>
SQL数据库完全复制
查看>>