题目链接:http://poj.org/problem?id=3666

题意是给出一组数,每个数代表当前位置的地面高度,问把路径修成非递增或者非递减,需要花费的最小代价?

///用dp[i][j]表示:前i个数构成的序列,这个序列最大值为j,dp[i][j]的值代表相应的cost。

///dp[i][j]=abs(j-w[i])+min(dp[i-1][k]);(k<=j)

///i-1构成的序列,最大值是k + (j-w[i])变成此步需要的花费

因为要把路径修成非递减路径,所以a[j]>a[k],所以我们要三重循环来搞,时间复杂度O(n^3)。

如果我们对原来数列进行复制排序的话,a[j]>a[k]就转化为了j>k,这样就成功的把时间复杂度从O(n^3)降为O(n^2)。

空间复杂度也可以用滚动数组从O(n^2)变为O(n)。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 2100
#define INF 0x3f3f3f3f
#define met(a) memset(a, 0, sizeof(a))
//1061109567 0x3f3f3f3f
//268435455 0xfffffff 本题用这个会错的;因为它不够大;害的我wa了那么多次-_-;
int n, dp[N][N], a[N], b[N]; int main()
{
while(scanf("%d", &n)!=EOF)
{
met(a); met(b);
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b+1, b+n+1);
for(int i=1; i<=n; i++)
{
int Min = INF;
for(int j=1; j<=n; j++)
{
Min=min(Min, dp[i-1][j]);
dp[i][j] = Min + abs(a[i] - b[j]);
}
}
int ans = INF;
for(int i=1; i<=n; i++)
ans=min(ans, dp[n][i]);
printf("%d\n", ans);
}
return 0;
}

  

Making the Grade---poj3666(类似离散化+dp)的更多相关文章

  1. P2518 [HAOI2010]计数 类似数位dp

    题意 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. 现 ...

  2. 【POJ3666】Making the Grade 离散化+DP

    学到了一个引理:在满足S最小化的条件下,一定存在一种构造序列B的方案,使得序列B中的数值都来自于A中.(数学归纳法+中位数定理得证) 对于状态的表示来说,首先肯定有一个 i ,表示选到了第 i 个数时 ...

  3. poj 3666 Making the Grade(离散化+dp)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  4. Making the Grade [POJ3666] [DP]

    题意: 给定一个序列,以最小代价将其变成单调不增或单调不减序列,代价为Σabs(i变化后-i变化前),序列长度<=2000,单个数字<=1e9 输入:(第一行表示序列长度,之后一行一个表示 ...

  5. 项目安排(离散化+DP)

    题目来源:网易有道2013年校园招聘面试二面试题 题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的 ...

  6. Making the Grade(POJ3666)

    题目大意: 给出长度为n的整数数列,每次可以将一个数加1或者减1,最少要多少次可以将其变成单调增或者单调减(不严格). 题解: 1.一开始我有一个猜想,就是不管怎么改变,最终的所有数都是原来的某个数. ...

  7. HDU 2836 (离散化DP+区间优化)

    Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/ ...

  8. hdu 4833 离散化+dp ****

    先离散化,然后逆着dp,求出每个点能取到的最大利益,然后看有没有钱,有钱就投 想法好复杂 #include <stdio.h> #include <string.h> #inc ...

  9. LightOJ 1085(树状数组+离散化+DP,线段树)

    All Possible Increasing Subsequences Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format: ...

随机推荐

  1. IE的layout布局

    我们那知道浏览器有bug,而且Windows上的lE的bug 似乎比太多数浏览器都多.IE/Win的表现与其他浏览器不同的原因之一是,显示引擎使用一个称为布局(layout)的内部概念.因为布均是一个 ...

  2. Oracle配置客户端

    一.引言 当我们需要连接远程的Oracle数据库服务器时,就需要在自己的机器上安装Oracle客户端了. 二.安装步骤与配置 参考:http://blog.csdn.net/luiseradl/art ...

  3. 跑测试没有web环境的情况

    有时候 当你跑测试的main方法的时候,会有一些莫名其妙的错误,明明mave pom的包是全的,web跑起来不会报错,可是在main方法下就是报错了,这个时候引入  <dependency> ...

  4. 如何使用Photoshop(PS)将图片的底色变为透明

    很多时候需要将一张图片的底色变得透明.本文描述了使用PS将图片的一部分变得透明的方法.本例将一段艺术字的背景去掉,将背景透明的文字单独保存成图片,这样以后将这段文字粘贴到其他素材上的时候,就不用担心它 ...

  5. 搭建hadoop集群,

    这个教程是2.4.1的 ,但是亲测对于2.6.5,是可以用的,对2.5.4应该也是支持的 1.准备Linux环境 1.0先将虚拟机的网络模式选为NAT 1.1修改主机名 vi /etc/sysconf ...

  6. oracle 存储过程中使用date 时、分、秒丢失

    今天有一开发兄弟找我.说出现一奇怪现象,在存储过程中赋date类型的值,时.分.秒都丢失了,以下来做个试验: SQL> drop table test purge; SQL> create ...

  7. 【BZOJ】1680: [Usaco2005 Mar]Yogurt factory(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1680 看不懂英文.. 题意是有n天,第i天生产的费用是c[i],要生产y[i]个产品,可以用当天的也 ...

  8. debug命令

    debug -r 查看寄存器-a 输入指令-t 执形命令 通用寄存器:AX=AH+ALBX=BH+BLCX=CH+CLDX=DH+DL 2Byte 16bitFFFF0-(2的16次方减1) debu ...

  9. VC中怎么输入特殊符号(如平方、立方等下标符号)

    同在列表控件里显示汉字一样,直接把输入法里特殊字符放进一个数组里,然后再赋值:CString F[]={"m²","∑","±"," ...

  10. UE对话框

    // Put your "OnButtonClicked" stuff here FText DialogText = FText::Format( LOCTEXT("P ...