XMUTOJ-默罕默德的炸弹
Description
炸弹是塔利班对付美军的武器之一。默罕默德在塔利班的主要任务是做炸弹。默罕默德所做的新型炸弹由若干个小炸弹组成,每个小炸弹有一个威力值,整个炸弹的威力值是组成这个炸弹的最大威力差的平方,即(max-min)^2,假设一个炸弹有5个小炸弹组成,威力分别为5 9 8 2 1,那么它的威力为(9-1)^2=64。
时间紧任务多默罕默德的师傅兼老爸老默罕默德又不在,默罕默德不敢调整小炸弹的顺序,只能确定它们的分组。请你帮助默罕默德确定小炸药的分组,使制造出的炸弹拥有最大的威力和。
Input
第一行有 1 个正整数N( 1 <= N <= 1000),表示有N个小炸弹。
第二行有N个数,其中第i个数Ai表示第i个小炸弹的威力值( 0 <= Ai <= 1000)。
Output
输出炸弹的威力和。
Sample Input
6 5 9 8 2 1 6
Sample Output
77
Source
思路:
把n个炸弹分为任意组,前提是炸弹顺序不能变,例如炸弹为1,2,3,4
那么可以分为{1},{2,3},{4}
或者{1,2},{3},{4}
说白话就是分为若干个连续的子序列
首先v2动态规划八字金句(看分析图,图中的某些部分看不懂我下面会一一解释)
第一
假设有这样一个大小为n的炸弹数组
index | 0 | 1 | 2 | ..... | i | .... | n-1 |
val | 5 | 4 | 6 | ..... | 1 | .... | 3 |
当我们选择到第i个下标的炸弹时(后面的统统不考虑):
我们可以考虑有哪些情况?
第i个炸弹可以与前面若干个炸弹组合成一个连续的炸弹组
例如{i-2,i-1,i}这三个炸弹组成一个炸弹组
那么就有i+1种情况:
{i-1,i}
{i-2,i-1,i}
{i-3,i-2,i-1,i}
....
{0,1,2,....,i-2,i-1,i}
第二
看懂了上面的解释
我们就可以定义一下通项了,设dp[i]为【0-i】范围内组成炸弹威力最大的值
起调也出来了,我们要求的最终结果就是dp[n-1],表示【0-n-1】范围内组成炸弹威力的最大值
第三
继续第一步的分析,我们选择到第i个炸弹
有i+1种可能的情况,我们是否可以枚举每一种情况,然后取最大值,这个值是不是就是dp[i]的值,即【0-i】范围内组成炸弹威力的最大值
那么我们用一个变量j来辅助枚举
转移方程伪代码:
for( j 范围 [0,i] )
{
dp[i]=max(dp[i], dp[j-1]+pre[j][i]);
}
dp[j-1]表示0-j-1范围内组成炸弹的最大值,pre[j][i]表示j-i范围内组成炸弹的威力值
pre[i][j]数组需要我们提前预处理,表示的就是从下标i到下表j区间内炸弹的威力值
第四
到此为止
通项:dp[i]
出口:dp[0]=0
起调:dp[n-1]
转移:
dp[i]=max(dp[i],dp[j-1]+pre[j][i])
代码:
#include<iostream>
#include<vector>using namespace std;
int a[1005];int main()
{//输入int n;scanf("%d", &n);for (int i = 0; i < n; i++)scanf("%d", &a[i]);vector<vector<int> > pre(n, vector<int>(n, 0));//pre预处理数组 下标表示从i到j区间内炸弹威力值//例如i=1,j=1表示下标为1的炸弹单独成组的炸弹威力值为0for (int i = 0; i < n; i++){int max_v = a[i];int min_v = a[i];for (int j = i; j < n; j++){if (a[j] > max_v)max_v = a[j];if (a[j] < min_v)min_v = a[j];pre[i][j] = (max_v - min_v) * (max_v - min_v);}}//pre表格输出/*for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){printf("%d ", pre[i][j]);}printf("\n");}*/vector<int> dp(n + 1, 0);dp[0] = 0;for (int i = 1; i < n; i++){for (int j = 0; j <= i; j++){//注意j的取值,当j=0时,j-1=-1会数组越界,手动判断一下if (j == 0)dp[i] = max(dp[i], 0 + pre[j][i]);elsedp[i]= max(dp[i], dp[j-1] + pre[j][i]);}}printf("%d\n", dp[n - 1]);return 0;
}
如果还不清楚的话可以私信我
XMUTOJ-默罕默德的炸弹相关推荐
- 厦门理工学院 oj-1184 默罕默德的炸弹
默罕默德的炸弹 Time Limit:1000MS Memory Limit:65536K Total Submit:282 Accepted:112 Description 炸弹是塔利班对付美军的武 ...
- 裁员这件事,谁也没有鲍尔默、纳德拉这两届微软CEO演绎的淋漓尽致
滴滴.Uber达成战略协议,经过昨日的酝酿依然热度不减,今天继续霸占科技媒体的首页.不过,就在昨晚将近凌晨的时候,Uber中国的800多名员工,收到"合并完成现金奖励"的邮件,内容 ...
- 何以箫声默,默声箫以何?
听人说,金鱼的记忆只有七秒. 而等一个不回来的人,直至彻底死心,需要七年,乃至更久. 2003 年,一本<何以笙箫默>红遍了大江南北.说来也巧,我是第一批读者,追着作者的脚步,看故事里蠢萌 ...
- 鲍尔默炮轰纳德拉提出的通用Windows平台战略
赛迪网讯 尽管Windows 10似乎已经取得一定的成绩,但是不管在计算机.平板电脑还是智能手机上面,Windows Store应用市场都拖了Windows 10的后腿. Windows Store应 ...
- 离开时请告诉自己生意就是生意
离开时请告诉自己生意就是生意 离职或者被离职,是职场中很常见的事情,每天这个星球上不知道要发生多少次,不管你经历过与否.体会到其中的滋味与否,他都会一直存在着!当这一切发生时,不管你是获利者还是受害者 ...
- Android、Java要收费了!学霸程序员怒捅马蜂窝,沙特记者命运?GitHub挂了!
Linux编程点击右侧关注,免费入门到精通! 参考:新浪,新浪科技,网络等 头条热点 学霸程序员怒捅马蜂窝,175亿独角兽因此缩水至20亿! 10月21日,一篇名为<估值 175 亿的旅游独角兽 ...
- 「巫师3(The Witcher 3:Wild Hunt)」游戏个人测评
<巫师3:狂猎(The Witcher 3: Wild Hunt)>是由CD Projekt RED制作,WB Games(NA).Spike Chunsoft(JP)发行的一款由同名小说 ...
- 2005年度最佳照片----幅幅经典
沙暴:4月26日,伊拉克与叙利亚和约旦的交界处,一起沙暴咆哮着穿过阿萨德沙漠.气象专家说这种延伸4000到5000英尺的沙暴十分罕见 走在严寒中:2月7日,伊朗首都德黑兰的Azadi广场,一位妇女走在 ...
- 关于app提示专为旧版Android打造的有关测试
因为经常进自己网站左康右康有没有人访问(极度自恋),老是去翻浏览器书签很麻烦,最近就想着把网站打包一个app,虽然我这破站也没什么可看的,不过至少打包后加点快捷功能就看不出来我一直在划水了 查看全文 ...
最新文章
- python多进程原理_python多进程的详细介绍(附示例)
- php里面没有mssql,为什么没有正确使用PHP / MSSQL的日期/时间?
- 华为服务器装系统怎么选pxe,华为TaiShan服务器PXE操作系统
- 系统管理员设置了系统策略 禁止进行此安装的修改办法
- JSP开发工具安装教程
- 4款最好的Android设备HTML编辑器
- 详解开关量,模拟量,数字量区别
- 3D检测入门知识梳理
- 网页中图片显示不出来,解决网页中图片不能显示的方法
- C++使用模板重载vector的加减法实现矩阵向量加减法
- 二等水准数据平差_二等水准测量方法与步骤
- 进不了BIOS,电脑开机黑屏
- 想给公司起个大气点的名字,大家帮忙啊!!!
- 关于chrome浏览器不能正常访问百度的解决方法
- 人脸识别原理:(初级篇)内含PPT
- php slug,php 中的var
- Java 读书笔记1
- 21世纪世界国土面积排名
- Mono及MonoDevelop介绍与安装
- 【C#】制作简单的飞行棋小游戏