BZOJ1049 数字序列 [DP]
来源:互联网 发布:超级优化女主角有几个 编辑:程序博客网 时间:2024/05/18 23:26
1049: [HAOI2006]数字序列
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1732 Solved: 745
[Submit][Status][Discuss]
Description
现在我们有一个长度为n的整数序列A。但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列。
但是不希望改变过多的数,也不希望改变的幅度太大。
Input
第一行包含一个数n,接下来n个整数按顺序描述每一项的键值。n<=35000,保证所有数列是随机的
Output
第一行一个整数表示最少需要改变多少个数。 第二行一个整数,表示在改变的数最少的情况下,每个数改变
的绝对值之和的最小值。
Sample Input
4
5 2 3 5
5 2 3 5
Sample Output
1
4
4
HINT
Source
思考
第一问就不说了,LIS水题。
第二问用f[i]表示前i个的最少花费,转移就从满足条件:从以a[i]结尾的LIS序列长度-1的j转移过来。
小技巧:邻接表存每个合法的j,然后枚举每个转移。
可以易证:如果从j转移到i的话,那么中间一定有一个
#include<bits/stdc++.h>#define N 400000#define INF 1LL<<60using namespace std;int a[N],c[N],n,tot,len,dp[N],head[N];long long f[N],sumf[N],sums[N];inline void read(int &res){ static char ch;int flag=1; while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;res=ch-48; while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;res*=flag;}struct data{ int to,nxt;}E[N*3];inline void addedge(int u,int v){ E[++tot].to=v;E[tot].nxt=head[u];head[u]=tot;}inline void LIS(){ a[++n]=0x3f3f3f3f;a[0]=-a[n]; for(register int i=0;i<=n;i++) c[i]=0x3f3f3f3f; len=1,c[1]=a[1],c[0]=-c[0]; dp[0]=0,dp[1]=1; for(register int i=2;i<=n;i++){ register int x=upper_bound(c,c+1+len,a[i])-c; len=max(len,x); c[x]=min(c[x],a[i]); dp[i]=x; } printf("%d\n",n-dp[n]);}inline void CHG(){ for(register int i=n;i>=0;i--)addedge(dp[i],i),f[i]=INF;f[0]=0; for(register int i=1,tmp;i<=n;i++) for(register int v,j=head[dp[i]-1];j;j=E[j].nxt){ if(v=E[j].to,v>i)break; if(a[v]>a[i])continue; for(register int k=v;k<=i;k++)sumf[k]=abs(a[k]-a[v]),sums[k]=abs(a[k]-a[i]); for(register int k=v+1;k<=i;k++)sumf[k]+=sumf[k-1],sums[k]+=sums[k-1]; for(register int k=v;k<i;k++) f[i]=min(f[i],f[v]+sumf[k]-sumf[v]+sums[i]-sums[k]); } printf("%d",f[n]);}int main(){ read(n); for(register int i=1;i<=n;i++) read(a[i]),a[i]-=i; LIS(),CHG(); return 0;}
阅读全文
0 0
- BZOJ1049 数字序列 [DP]
- 【bzoj1049】【HAOI2006】【数字序列】【dp+暴力】
- [BZOJ1049][HAOI2006]数字序列(dp)
- [bzoj1049][HAOI2006]数字序列
- bzoj1049: [HAOI2006]数字序列
- BZOJ1049: [HAOI2006]数字序列
- bzoj1049 [HAOI2006]数字序列
- bzoj1049 数字序列
- bzoj1049: [HAOI2006]数字序列
- bzoj1049 [HAOI2006]数字序列 ( LIS + 区间DP)
- BZOJ1049
- SSL2418 数字序列 状压DP
- 【BZOJ 1049】【HAOI 2006】数字序列【DP】
- codevs 2622 数字序列 DP 解题报告
- 模拟赛4 数字序列 50分做法 状压DP
- 【基础练习】【线性DP】codevs2622 数字序列(最大连续子序列和)题解
- 数字序列
- 数字序列
- Python3-字典
- 17、javaWebService,的使用
- 不错的字体(收集)
- 18、webservice使用
- 19、javascript基础知识
- BZOJ1049 数字序列 [DP]
- 遇到高版本的CAD文件打不开别急
- 20、formAdd,javascript实现动态添加
- Android系统架构
- C语言学习教程
- 21、在选择的时候跳到另一页面上,选择男女,然后提交表单内容
- Python3-元祖
- 22、继续javascript,左边选中的跳到右边
- 微软Surface Pro 3笔记本如何u盘装win10系统教程