poj3666 线性dp
要把一个序列变成一个不严格的单调序列,求最小费用
/*
首先可以证明最优解序列中的所有值都能在原序列中找到
以不严格单增序列为例,
a序列为原序列,b序列为升序排序后的序列
dp[i][j]表示处理到a中第i个数,这些数中最大值为b[j]的费用,由单调性可知第i个数肯定变为b[j]
那么dp[i][j]等价于第i个数变成b[j]的费用
那么有 dp[i][j]=abs(b[j]-a[i])+min(dp[i-1][k]),k<=j
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 2005
#define ll long long
ll n,a[maxn],b[maxn],dp[maxn][maxn]; ll solveup(){
sort(b,b+n);
memset(dp,,sizeof dp);
for(int i=;i<n;i++)
dp[][i]=abs(a[]-b[i]);//初始条件 for(int i=;i<n;i++){
ll Min=dp[i-][];
for(int j=;j<n;j++){
Min=min(Min,dp[i-][j]);//单调增加的集合可以直接用Min来维护
dp[i][j]=abs(a[i]-b[j])+Min;
}
} ll ans=dp[n-][];//求结果
for(int i=;i<n;i++)
ans=min(ans,dp[n-][i]);
return ans;
} int main(){
while(scanf("%lld",&n)==){
for(int i=;i<n;i++)scanf("%lld",&a[i]),b[i]=a[i];
printf("%lld\n",solveup());
}
}
可以用滚动数组实现,空间省了许多
/*
滚动数组解法,第一维可以省去,dp[j]表示已经完成的序列用的最大值是b[j],状态i会覆盖状态i-1并且没有影响
dp[j]=abs(a[i]-b[j])+min(dp[k]),k<=j
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 2005
#define ll long long ll n,a[maxn],b[maxn],dp[maxn];
ll solve(){
sort(b,b+n);
for(int j=;j<n;j++)
dp[j]=abs(a[]-b[j]); for(int i=;i<n;i++){
ll Min=dp[];
for(int j=;j<n;j++){
Min=min(Min,dp[j]);
dp[j]=abs(a[i]-b[j])+Min;
}
} ll ans=dp[];
for(int j=;j<n;j++) ans=min(ans,dp[j]);
return ans;
} int main(){
while(scanf("%lld",&n)==){
for(int i=;i<n;i++)scanf("%lld",&a[i]),b[i]=a[i];
printf("%lld\n",solve());
}
}
poj3666 线性dp的更多相关文章
- POJ3666 线性dp_离散化_贪心
POJ3666 线性dp_离散化_贪心 就DP而言这个题不算难,但是难就难在贪心,还有离散化的思想上 题目大意:n个土堆,问你最少移动多少单位的图,可以使得这n个土堆变成单调的 dp[i][j]表示前 ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
- 『最大M子段和 线性DP』
最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...
随机推荐
- sklearn模块函数介绍
一.sklearn.metrics.accuracy_score 这个包可以帮助我们统计两个列表中相同位置元素相同的个数,比如我们预测出来的label和真实的label有多大差距,预测的准确率是多少, ...
- ACPI:Memory错误解决办法
Linux系统装在vmware12中,打开虚拟机时报错,报错内容大概如下: ACPI:memory_hp:Memory online failed for 0x100000000 - 0x400000 ...
- 整理备忘一波liunx命令(持续更新)
# 分区挂载 查看当前目录下的文件大小 du --max-depth= -h # 文件操作 # 编辑操作 #liunx 字体设置 苹果方字体下载安装 # 网洛端口 netstat命令各个参数说明如下: ...
- 纯js异步无刷新请求(只支持IE)【原】
纯js异步无刷新请求 下载地址:http://pan.baidu.com/s/1slakL1F 所以因为非IE浏览器都禁止跨域请求,所以以只支持IE. <HTML> <!-- 乱码( ...
- 源码分析之CountDownLatch
https://www.cnblogs.com/leesf456/p/5406191.html
- 转--python -- 收发邮件
官方 import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smt ...
- 解决IntelliJ IDEA无法读取配置*.properties文件的问题
idea对这些配置的文件方式很明显和eclipse是不同的.在idea中有一个 Content Roots的概念.需要为每一个folder配置相应的Content Roots.Content Root ...
- 解决idea中找不到程序包和找不到符号的问题
问题如图: 解决方法: 将三处编码都设置成UTF-8,亲测有效 本人也是拜读大佬博客后解决的: http://www.cnblogs.com/wzhanke/p/4747966.html
- luogu 4158 粉刷匠 dp套dp
dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...
- JavaScript之DOM概念
一.DOM概念 1.DOM是什么? 1.1 起源.DOM起源于Netscape与Microsoft 公司的DHTML(动态HTML). 1.2 名词解释.Document Object Model,文 ...