题解 P2426 【删数】
一眼看去:区间DP
数据范围:三重循环
好了不装B了,开始说正事
这题非常明显是区间DP。
按照惯例,先定义状态。
分析题目,发现除了区间左端点和右端点之外,什么也不需要加进状态里。因为显而易见除了区间左右端点,没有什么能够影响答案。
所以我们定义状态\(dp[l][r]\)为区间\([l,r]\)的最大答案。
这个“操作价值”可以两重循环预处理出来,所以用\(pre[l][r]\)代表删除区间\([l,r]\)的最大价值。非常明显的,甚至题目里已经直接写明白了, 其实不用预处理,现场算就行,反正是\(O(1)\)的
\begin{cases} a[l],
& \text {$l=r$} \\
|a[l]-a[r]|\times (r-l+1), & \text{$else$} \end{cases}
\]
然后就是最重要的一步——状态转移方程。
题目里有一个操作,就是一个区间删除一些数,失去一些“潜在的”价值。那么把这个过程反过来,一个区间加上一些数,得到一些“潜在的”价值。答案就是区间\([1,n]\)的最大潜在价值。
可以得到:
\]
翻译成人话就是,一个区间的潜在价值,等于从左边删去一些数或者从右边删去一些数后再加上删去的数的价值的较大值。
知道了状态转移方程,代码就非常好写了。
AC Code:
#include <bits/stdc++.h> //赞美万能头!
using namespace std;
#define MAXN 105
int n,a[MAXN],dp[MAXN][MAXN],pre[MAXN][MAXN];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
pre[i][i]=dp[i][i]=a[i];//因为题目中的特殊约定“如果只去掉一个数,操作价值为这个数的值。”
}
for(int len=2;len<=n;len++){
for(int l=1;l<=n-len+1;l++){
int r=l+len-1;
pre[l][r]=dp[l][r]=abs(a[l]-a[r])*(r-l+1);//预处理,因为有可能最优方案是把区间[l,r]都删掉,所以要给dp[l][r]也赋值。
}
}
for(int len=2;len<=n;len++){
for(int l=1;l<=n-len+1;l++){
int r=l+len-1;
for(int i=l;i<=r-1;i++){
dp[l][r]=max(dp[l][r],dp[l][i]+pre[i+1][r]);
dp[l][r]=max(dp[l][r],pre[l][i]+dp[i+1][r]);//就是状态转移方程233
}
}
}
printf("%d\n",dp[1][n]);//输出总的“潜在价值”。
return 0;
}
由于LZ非常菜,有可能有自以为是的地方,所以请在评论区无情的指出qwq
题解 P2426 【删数】的更多相关文章
- P2426 删数
P2426 删数 题目描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i(1≤i≤n)个数(只能从两边删除数),剩下N-i个数,再把剩下的数按以上操作处 ...
- 洛谷P2426 删数 [2017年4月计划 动态规划12]
P2426 删数 题目描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i(1≤i≤n)个数(只能从两边删除数),剩下N-i个数,再把剩下的数按以上操作处 ...
- 【题解】洛谷P2426删数
链接 https://www.luogu.org/problemnew/show/P2426 念念碎 第一次接触到区间DP(瑟瑟发抖) 所以象征性地看了一下题解 这好像是一道比较基础的区间DP吧 但是 ...
- 【题解】删数问题(Noip1994)
题目 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 11506 通过数: 3852 [题目描述] 输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新 ...
- 洛谷 P2426 删数
题目传送门 解题思路: 区间DP,f[i][j]表示区间i~j可获得的最大值,因为本题的所有区间是可以直接一次性把自己全删掉的,所以所有区间初始化为被一次性删除的值,然后枚举断点,跑区间DP. AC代 ...
- 【洛谷P2426】删数
删数 题目链接 一道裸的区间DP,f[l][r]表示剩下区间[l,r]时的最大价值 可以由f[1~l-1][r]和f[l][r+1~n]转移过来 详见代码: #include<algorithm ...
- 题解 洛谷 P5324 【[BJOI2019]删数】
先考虑对于一个序列,能使其可以删空的的修改次数. 首先可以发现,序列的排列顺序是没有影响的,所以可以将所有数放到桶里来处理. 尝试对一个没有经过修改的可以删空的序列来进行删数,一开始删去所有的\(n\ ...
- 删数方案数(regex)
[题目描述] 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同 ...
- [BJOI2019]删数(线段树)
[BJOI2019]删数(线段树) 题面 洛谷 题解 按照值域我们把每个数的出现次数画成一根根的柱子,然后把柱子向左推导,\([1,n]\)中未被覆盖的区间长度就是答案. 于是问题变成了单点修改值,即 ...
- codevs4096 删数问题
题目描述 Description 键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N 和S,寻找一种方案使得剩下的数字组成的新数最小. 输入 ...
随机推荐
- C++ 第二天 字符串
字符串 字符串是最常用的一种数据类型了,在python中声明字符串和声明其他类型的数据一样,都非常的简单.但是在c++中,对于字符串的操作,相对来说要稍微复杂一些. C++ 提供了以下两种类型的字符串 ...
- Python os.fstatvfs() 方法
概述 os.fstatvfs() 方法用于返回包含文件描述符fd的文件的文件系统的信息,类似 statvfs().高佣联盟 www.cgewang.com Unix上可用. fstatvfs 方法返回 ...
- 2019 7 8 HL 模拟赛
今天 很不爽 昨天晚上没有睡好觉 大约2点才睡着吧 反正翻来覆去睡不着 不知道为什么可能可行流 或者可行费用流并没有深刻理解 .我不会写 让我心情非常的焦躁. 大凶 顺理成章的被3位强者吊着锤(妈呀我 ...
- dp的本质
什么是真正的dp?有什么特点?怎么来搞. 最近遇到了一些以前的题目发现没有好好的理解就直接写了 大多都是书上的算法并不是自己真正的理解. 1 关于背包 我总结一下 可能 有助于对模型的更快发现 01 ...
- SpringBoot+Dynamic多数据源动态切换
最近做了个小模块,需求就是项目同时读取三个数据库,操作数据.并不是分库分表,只用定时跑,不需要对外提供接口. 技术选型:SpringBoot + Mybatis Plus(Mybatis) + Dyn ...
- Neo4j 学习笔记(-)
Neo4j 的使用说明(一)(基于V3.4.9) 下一篇(二):https://www.cnblogs.com/infoo/p/11947467.html 一.Neo4j简介 Neo4j是一个高性能的 ...
- 面试官:怎么做JDK8的内存调优?
面试官:怎么做JDK8的内存调优? 看着面试官真诚的眼神,心中暗想看起来年纪轻轻却提出如此直击灵魂的问题.擦了擦额头上汗,我稍微调整了一下紧张的情绪,对面试官说: 在内存调优之前,需要先了解JDK8的 ...
- java学习day01之String的特点,如何实现,并且有哪些重要方法?
1.以主流的JDK版本1.8来说,String内部实际存储结构为char数组,源码如下: public final class String implements java.io.Serializa ...
- Python高性能HTTP客户端库requests的使用
Python中有许多HTTP客户端.使用最广泛且最容易的是requests. 持续连接 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...
- vue中methods互相调用的方法
a:function(goods) { this.aa= []; this.bb= 0; this.cc= 0; }, b:function(){ if(this.bbb!= 0){ this.aa= ...