题目大意:

给定一个长度为n的整数序列.在改变的数最小的和改变的幅度最小的前提下把它变成一个单调严格上升的序列.求改变的最小的数和这个幅度。

题解:

(貌似以前考试考过这道题)

其实这道题就是两道题拼一块的

我们首先考虑第一问

这是一个经典模型,我们有

当有\(i - j \leq a_i - a_j\)\(a_i\)和\(a_j\)不用更改\((i > j)\)

所以我们变号得到\(a_j - j \leq a_i - i\)

所以我们将所有序列中的值减去下标再做一遍最长不下降子序列即可

然后我们使用减去了下标的那个数组作为第二问的初始数组

我们设\(f[i]\)为第一问的LCIS的dp数组,\(g[i]\)表示第二问的dp数组

(均表示1~i的答案)

我们有\(g[i] = min{g[j] + calc(j+1,i)}\text{当且仅当}(f[i] == f[j] + 1)\)

由...ydc的题解我们知道...

现在一个结论是,calc(j,i)的方案,一定会以某个k 为分界使得[j,k] 均为\(b_j\) 且\([k+1,i]\) 均为\(a_i\)

证明已跪...

所以我们利用这个性质统计答案即可

(很抱歉我连怎么用都不会,%了一发hzwer的代码)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(ll &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline ll cat_max(const ll &a,const ll &b){return a>b ? a:b;}
inline ll cat_min(const ll &a,const ll &b){return a<b ? a:b;}
const ll maxn = 35010;
const ll inf1 = 1<<30;
const ll inf2 = 1LL<<60;
// inline ll abs(ll x){
// return x < 0 ? -x : x;
// }
struct Edge{
ll to,next;
}G[maxn];
ll head[maxn],cnt;
void add(ll u,ll v){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
}
ll a[maxn],f[maxn],m[maxn],g[maxn];
ll lim;
inline ll find(ll x){
ll l = 1,r = lim,ret = 0;
while(l <= r){
ll mid = (l+r) >> 1;
if(m[mid] <= x) ret = mid,l = mid+1;
else r = mid - 1;
}return ret;
}
ll suma[maxn],sumb[maxn];
int main(){
memset(m,0x3f,sizeof m);
ll n;read(n);
for(ll i=1;i<=n;++i) read(a[i]),a[i] -= i;
a[++n] = inf1;m[0] = -inf1;
for(ll i=1;i<=n;++i){
f[i] = find(a[i]) + 1;
//printf("f[%d] = %d\n",i,f[i]);
lim = max(lim,f[i]);
m[f[i]] = min(a[i],m[f[i]]);
}
for(ll i = n;i>=0;--i) add(f[i],i),g[i] = 1LL<<60;
a[0] = -inf1;g[0] = 0;
#define v G[p].to
for(ll u = 1;u<=n;++u){
for(ll p = head[f[u]-1];p;p=G[p].next){
if(v > u) break;
if(a[v] > a[u]) continue;
suma[v-1] = sumb[v-1] = 0;
for(ll i=v;i<=u;++i){
suma[i] = suma[i-1] + abs(a[v] - a[i]);
sumb[i] = sumb[i-1] + abs(a[u] - a[i]);
}
for(ll i=v;i<=u;++i){
// printf("%d <- %d\n",g[u],g[v] + suma[i] - suma[v] + sumb[u] - sumb[i]);
g[u] = min(g[u],g[v] + suma[i] - suma[v] + sumb[u] - sumb[i]);
}
}
}
#undef v
printf("%lld\n%lld\n",n-f[n],g[n]);
getchar();getchar();
return 0;
}

bzoj 1049: 数字序列 dp的更多相关文章

  1. BZOJ 1049 数字序列

    Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个数 ...

  2. BZOJ 1049 数字序列(LIS)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1049 题意:给出一个数列A,要求:(1)修改最少的数字使得数列严格递增:(2)在( ...

  3. 【BZOJ1049】【Luogu P2501】 [HAOI2006]数字序列 DP,结论,LIS

    很有(\(bu\))质(\(hui\))量(\(xie\))的一个题目. 第一问:求最少改变几个数能把一个随机序列变成单调上升序列. \(Solution:\)似乎是一个结论?如果两个数\(A_i\) ...

  4. bzoj 4244 括号序列dp

    将各种情况绕环等看作括号序列,括号内的区域上下都需要累加答案,左右也是 f[i][j] 代表 前i个车站已经处理完的有j个左括号的最小权值 我们可以发现,更新的来源来自于 i-1, 和 i 将上 描述 ...

  5. BZOJ1049:[HAOI2006]数字序列(DP)

    Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列. 但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个 ...

  6. 【BZOJ1049】 [HAOI2006]数字序列

    BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...

  7. 【BZOJ】【1049】【HAOI2006】数字序列

    DP 第一问比较水……a[i]-=i 以后就变成最长不下降子序列问题了,第二问这个结论好神奇,考试的时候怎么破?大胆猜想,不用证明?TAT 题解:http://pan.baidu.com/share/ ...

  8. 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)

    1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...

  9. bzoj 1049 [HAOI2006]数字序列

    [bzoj1049][HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...

随机推荐

  1. win10系统架构调用

    操作系统模型 操作系统有两种模式: 用户模式 内核模式 当用户模式调用系统服务时,CPU执行一个特殊的指令以切换到内核模式(Ring0),当系统服务调用完成时,操作系统切换回用户模式(Ring3).  ...

  2. Maven的安装以及在IDEA中的配置

    Maven的安装 之前的一篇博客中已经写到过了Maven的安装.这里就只给出链接了. http://www.cnblogs.com/tuhooo/p/5905569.html 版本虽然不同,但是安装的 ...

  3. OrCAD Capture出现丢失cdn_sfl401as.dll问题

    昨天晚上我PCB图的时候还用OrCAD这个组件来着呢.但是还是好好的.但是今天当我再次启动程序的时候就出现了以下的对话框. 当时就吓了好一跳.好好软件怎么突然就不行了呢?先说说我出现这个问题之后的内心 ...

  4. PageHelper

    https://pagehelper.github.io/ Mybatis分页插件PageHelper简单使用 SpringBoot之分页PageHelper

  5. WCP源码分析 与SpringMVC学习资料

    1.在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便. Spring2.5为我们引入了组件自动扫描机制,他可以在 ...

  6. Java 学习 day06

    01-面向对象(Static关键字) package myFirstCode; /* 静态:static. 用法:是一个修饰符,用于修饰成员(成员变量,成员函数) 当成员被静态修饰后,就多了一个调用方 ...

  7. HibernateTemplate方法的使用

    1.查询帖子(Post)为例 查找所有的帖子 public List<Post> findPosts() { String hql = "from Post p left joi ...

  8. 九度OJ 1149:子串计算 (计数、排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1026 解决:571 题目描述: 给出一个01字符串(长度不超过100),求其每一个子串出现的次数. 输入: 输入包含多行,每行一个字符串. ...

  9. AWS:1.相关概念、创建云主机的过程

    概念 EC2是弹性的云计算 云主机 也即虚拟机,由分配的CPU.内存.网络和磁盘等资源组成 好处:维护成本低(主机替换).环境升级成本低 AMI:映像 创建云主机的蓝图,指定初始状态1 预装什么操作系 ...

  10. 替代或者与 Redis 配合存储十亿级别列表的数据.

    http://ssdb.io/docs/zh_cn/index.html 用户案例 如果你在生产环境中使用 SSDB, 欢迎你给我发邮件(ssdb#udpwork.com), 我很愿意把你加入到下面的 ...