【HDOJ 5653】 Bomber Man wants to bomb an Array.(DP)

【HDOJ 5653】 Bomber Man wants to bomb an Array.(DP)

Bomber Man wants to bomb an Array.

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 389    Accepted Submission(s): 117

Problem Description

Given an array and some positions where to plant the bombs, You have to print the Total Maximum Impact.

Each Bomb has some left destruction capability L
and some right destruction capability R
which means if a bomb is dropped at ith
location it will destroy L
blocks on the left and R
blocks on the right.

Number of Blocks destroyed by a bomb is L+R+1

Total Impact is calculated as product of number of blocks destroyed by each bomb.

If ith
bomb destroys Xi
blocks then TotalImpact=X1?X2?....Xm

Given the bombing locations in the array, print the Maximum Total Impact such that every block of the array is destoryed exactly once(i.e it is effected by only one bomb).

### Rules of Bombing

1. Bomber Man wants to plant a bomb at every bombing location.

2. Bomber Man wants to destroy each block with only once.

3. Bomber Man wants to destroy every block.

Input

There are multi test cases denote by a integer
T(T≤20)
in the first line.

First line two Integers N
and M
which are the number of locations and number of bombing locations respectivly.

Second line contains M
distinct integers specifying the Bombing Locations.

1 <= N <= 2000

1 <= M <= N

Output

as Maximum Total Impact can be very large print the floor(1000000 * log2(Maximum Total Impact)).

Hint:

Sample 1:

Sample 2:

Sample Input

2
10 2
0 9
10 3
0 4 8

Sample Output

4643856
5169925

Source

BestCoder Round #77 (div.2)

Recommend

wange2014   |   We have carefully selected several similar problems for you:  5650 5649 5648 5646 5645

题目大意:有n个块。在其中m块上装有炸药。

要求引爆这些炸药。每个炸药可以由你给定一个左右引爆边界[L,R]表示向左L个块 向右R个块会被摧毁,即爆炸威力为L+R+1(本身所在的块也被摧毁)

设第i个炸药的爆炸威力为Xi

那么总的爆炸威力为X1*X2*X3*X4*...*Xm

问floor(1000000 * log2(Maximum Total Impact)) floor为向下取整函数 Maximum Total Impact为最大爆炸威力和

求log2就是因为成起来太大了。

利用log的性质,可知log(m,(a*b) ) = log(m,a)+log(m,b)

这样用dp[i]表示炸到第i个块可以得到的最大爆炸威力的log

这样可以枚举所有的炸药,对于每个炸药枚举爆炸范围[L,R] 枚举到左右的炸药即可

这样转移方程就是dp[R] = max(dp[R],dp[L-1]+log(R-L+1)/log2)

代码如下:

#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <list>
#include <algorithm>
#include <map>
#include <set>
#define LL long long
#define Pr pair<int,int>
#define fread() freopen("in.in","r",stdin)
#define fwrite() freopen("out.out","w",stdout)

using namespace std;
const int INF = 0x3f3f3f3f;
const int msz = 10000;
const int mod = 1e9+7;
const double eps = 1e-8;

double dp[2333];
int boom[2333];

int main()
{
	//fread();
	//fwrite();

	int t,n,m;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);

		boom[0] = 0;
		boom[m+1] = n+1;
		for(int i = 1; i <= m; ++i)
		{
			scanf("%d",&boom[i]);
			boom[i]++;
		}

		sort(boom+1,boom+m+1);
		memset(dp,0,sizeof(dp));
		for(int i = 1; i <= m; ++i)
		{
			for(int l = boom[i-1]+1; l <= boom[i]; ++l)
			{
				for(int r = boom[i+1]-1; r >= boom[i]; --r)
				{
					dp[r] = max(dp[r],dp[l-1]+log((r-l+1)*1.0)/log(2.0));
				}
			}
		}
		LL ans = floor(1e6*dp[n]);
		printf("%lld\n",ans);
	}

	return 0;
}

时间: 2024-09-30 11:06:36

【HDOJ 5653】 Bomber Man wants to bomb an Array.(DP)的相关文章

【Android 初学】11、关于Android当中的线程(初级)

Start Android 1.回顾Java当中的线程概念 1)线程的两种实现方式 2)线程的生命周期 3)多线程同步 (多个线程访问同一个资源,在同) 2.MainThread与Worker Thread 1)UI相关的代码就是MainThread 2)其他代码就是WorkerThread(不允许操作UI,ProgressBar可以) 3)在一个应用程序当中,主线程通常用于接收用户的输入,以及将运算的结果反馈给用户(也就是主线程不能阻塞) 对于一些可能会产生阻塞的操作,必须放在Worker T

【华为练习题】用两个栈来模拟队列(中级)

[华为练习题]用两个栈来模拟队列(中级) 题目 栈的特点是后进先出,队列的特点是先进先出.所以,用两个栈S1和S2模拟一个队列时, 要求两个栈S1和S2的长度都是5. 要求实现以下函数: enQueue 将元素value插入队列,若入队列成功返回true,否则返回false deQueue 从队列中取出一个元素放入value,若出队列成功返回true,否则返回false. isEmptyQueue 判用队列是否为空,如果是空则返回true,如果不是空则返回false. 分析 S1作输入栈,逐个元

【cf1293E】E.Xenon&#39;s Attack on the Gangs(dp)

传送门 题意: 给出一颗树,树上随机分配\(0\)到\(n-1\)的边权,不存在权值相同的两条边. 定义\(mex(u,v)\)为:树上\(u\)到\(v\)的简单路径中所有边权的\(mex\). 求 \[ \sum_{1\leq u\leq v\leq n}mex(u,v) \] 思路: 将问题转化为求一条边的贡献,显然一条边对跨过这条边的所有点对有贡献: 多条边时,只有链的形式才会增加贡献,可以不用考虑具体的权值分配: 因为数据范围只有\(3000\),考虑枚举每条链进行\(dp\). 记忆

【整合篇】Activiti业务与流程整合之查询(二)

继上篇博客:[整合篇]JBPM4.4业务与流程整合之查询 应用第二种方式:申请实体中加入需要的相应的工作流的属性 package com.tgb.itoo.basic.entity; import java.util.Date; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Co

【贪心专题】HDU 1052 Tian Ji -- The Horse Racing (田忌赛马)

链接:click here~~ 题意: 田忌和齐王各有N匹马,判断怎样比赛,使田忌净胜场数最多. 之前无意看到强哥写的题解(很早就做了~~囧)感觉很有意思,但是当时忘了去A 了,现在回想起来此题很是经典了,意犹未尽的感觉,直接复制题解了,思路写的很清楚了, 基本就是看着思路敲的 [解题思路]不管怎么比赛,都要让田忌的马发挥最大价值.当然,马的第一要务是用来赢得比赛,而且要最大效益的赢,也就是要赢对方仅次于自己的马. 当他不能完成这个任务的时候就要去输,并拉对方最快的马下水,给自己后面的队友创造更

【生活现场】从打牌到map-reduce工作原理解析(转)

原文:http://www.sohu.com/a/287135829_818692 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 对小史面试情况感兴趣的同学可以观看面试现场系列. 找到工作后的一小段时间是清闲的,小史把新租房收拾利索后,就开始找同学小赵,小李和小王来聚会了. 吃过午饭后,下午没事,四个人一起商量来打升级.打升级要两副扑克牌,小史就去找吕老师借牌去了. [多几张牌] 吕老师给小史拿出一把牌. [map-reduce] (注

【知乎】前端现在怎么这么多人?(2017-2019)

顾轶灵  2017-02-19?如果你在知乎关注了「前端开发」这个话题,那么你三天两头就会看到类似这样的问题: 我转专业零基础学前端,多久能实习?何时才能找到工作?去 BAT 要学习到什么程度?本人 xx 岁女生,在学校的时候写代码就不行,适合做前端吗?以后会不会太累?我自学前端几个月了,xx 官网也模仿过了,HTML/CSS都没啥问题了,但是 JS 学不进去怎么办?我培训了几个月出来,发现前端工作怎么这么难找?简历不造假连面试机会都没有怎么办?现在前端市场是不是已经饱和了?xx 网上每个前端的

【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)

4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 370  Solved: 237 Description 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之后将字符串视为一个环,从位置1,2,3,...,N+1为起点读出N+1个字符,就能得到N+1个字符串. 比如对于字符串"ABCAAA",我们可以得到这N+1个串: ABCAAA.

【整合篇】Activiti业务与流程整合之查询(三)

继前两篇博客:应用第三种方式 实体中不需要引入任何与工作流相关的任何属性,单纯的做好自己即可!例如如下申请实体(Leave): package com.tgb.itoo.basic.entity; import java.util.Date; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.persistence.CascadeType; import javax.persist