要把一个序列变成一个不严格的单调序列,求最小费用

/*
首先可以证明最优解序列中的所有值都能在原序列中找到
以不严格单增序列为例,
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的更多相关文章

  1. POJ3666 线性dp_离散化_贪心

    POJ3666 线性dp_离散化_贪心 就DP而言这个题不算难,但是难就难在贪心,还有离散化的思想上 题目大意:n个土堆,问你最少移动多少单位的图,可以使得这n个土堆变成单调的 dp[i][j]表示前 ...

  2. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  3. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  4. 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门 ...

  5. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  6. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

  7. poj 1050 To the Max(线性dp)

    题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...

  8. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

  9. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...

随机推荐

  1. js之string操作符

    1.字符方法 // 输出索引值的字符 'zhangamie'.charAt(2) // "a" 'zhangamie'[2] //"a" // 输出编码 a的a ...

  2. Tomcat部署实战

    Tomcat部署实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.登录官网下载tomcat软件包(http://tomcat.apache.org/) 1>.在安装to ...

  3. python---定义一个session类(无错)

    import tornado.web #放在内存 redis 文件 数据库 container={} #定义一个session类 class Session: def __init__(self,ha ...

  4. Git,Github和Gitlab简介和基本使用

    什么是Git Git是一个版本控制系统(Version Control System,VCS). 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 多年前,我在法国做第一 ...

  5. JavaScript数组倒序函数reverse()

    左边为原数组,右边为array.reverse()的结果: 函数很简单,但是 var temp = ChartConfig.getMonthData(); $scope.monthList = tem ...

  6. postgresql时间处理

    时间取到截取 例:select date_trunc('second', "reportTime") from travel_message limit 10; 结果: 他人博客: ...

  7. VS2015 与 Git 的简单使用

    前言 在白忙之中抽了点时间,记录了下 VS 与 Git 的简单使用. 在之前使用命令行的时候,提交或拉取代码时,总报错:(提取时遇到错误: Unsupported URL protocol),后来在网 ...

  8. Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0

    1 启动hbase的时候爆出警告 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; suppor ...

  9. mongodb系列~ mongodb慢语句(3)

    简介: 关于mongodb慢日志是如何收集 一 mongodb慢日志的开启 1 直接设置参数,不重启服务:db.setProfilingLevel(1) 2 添加启动参数,重启服务:添加profile ...

  10. Application生命周期

    onCreate 在创建应用程序时创建 onTerminate 当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那么将不会提醒,并且不调用应用程序的对象的on ...