题目链接

错解:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
const int N=;
int a[N];
int m[N][N]; // dp[i][j] 状态结尾的值
LL dp[N][N];// 前i个元素有序最大值小于等于a[j]的最值
int n;
int main ()
{
while (~scanf ("%d",&n) ) {
for (int i=;i<=n;i++)
scanf ("%d",&a[i]);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
m[i][j]=a[i];
if (a[i]>a[j]) m[i][j]=a[j];
if (a[i]<m[i-][j]) m[i][j]=m[i-][j];
dp[i][j]=dp[i-][j]+abs (a[i]-m[i][j]);
cout<<"i: "<<i<<" j: "<<a[j]<<" "<<dp[i][j]<<endl;
}
LL ans=dp[n][];
for (int i=;i<=n;i++)
ans=min (ans,dp[n][i]);
printf("%lld\n",ans);
}
return ;
}
/* 错误的例子2 5 2 2 10
因为定义的状态是 前n个元素小于等于a[j]的最小次数
dp[3][2](小于等于5)最优解有 2 5 5 和 2 2 2
这两个状态不能合并因为对后面的影响是不一样的
应该重新定义状态 dp[i][j]: 前n个元素有序最大元素是a[j]的最优解
*/

正解:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
const int N=;
int a[N],b[N];
LL dp[N][N]; //前i个元素以a[j]结尾的最值
int n;
int main ()
{
while (~scanf ("%d",&n)) {
memset (dp,0x3f,sizeof(dp));
for (int i=;i<=n;i++) {
scanf ("%d",&a[i]);
b[i]=a[i];
}
sort (b+,b++n);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
dp[i][j]=abs(a[i]-b[j]);
if (i!=) dp[i][j]+=dp[i-][j];
dp[i][j]=min (dp[i][j-],dp[i][j]);
}
printf("%d\n",dp[n][n]);
}
return ;
}

对于动态规划的理解我还需要加强。。。

poj-3666 【对dp子状态无后效性的理解】的更多相关文章

  1. HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)

    HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解) 题意分析 要先排序,在做01背包,否则不满足无后效性,为什么呢? 等我理解了再补上. 代码总览 #in ...

  2. CodeForces - 714E + POJ - 3666 (dp严格单调递增与非严格单调递增)

    左偏树 炒鸡棒的论文<左偏树的特点及其应用> 虽然题目要求比论文多了一个条件,但是……只需要求非递减就可以AC……数据好弱…… 虽然还没想明白为什么,但是应该觉得应该是这样——求非递减用大 ...

  3. Poj 3666 Making the Grade (排序+dp)

    题目链接: Poj 3666 Making the Grade 题目描述: 给出一组数,每个数代表当前位置的地面高度,问把路径修成非递增或者非递减,需要花费的最小代价? 解题思路: 对于修好的路径的每 ...

  4. Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性

    https://codeforces.com/contest/1140/problem/E 局部dp + 定义状态取消后效性 题意 给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字 ...

  5. [hdu4628 Pieces]二进制子状态,DP

    题意:给一个长度为16的字符串,每次从里面删掉一个回文序列,求最少需要几次才能删掉所有字符 思路:二进制表示每个字符的状态,那么从1个状态到另一个状态有两种转移方式,一是枚举所有合法的回文子序列,判断 ...

  6. poj 1088 滑雪 DP(dfs的记忆化搜索)

    题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 ...

  7. 「POJ 3666」Making the Grade 题解(两种做法)

    0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...

  8. poj上的dp专题

    更新中... http://poj.org/problem?id=1037 dp[i][j][0]表示序列长度为i,以j开始并且前两位下降的合法序列数目; dp[i][j][1]表示序列长度为i, 以 ...

  9. 把一个序列转换成非严格递增序列的最小花费 POJ 3666

    //把一个序列转换成非严格递增序列的最小花费 POJ 3666 //dp[i][j]:把第i个数转成第j小的数,最小花费 #include <iostream> #include < ...

随机推荐

  1. eclipse安装scala环境

    1.安装eclipse插件,依次点击Help->Eclipse Marketplace 2.输入scala,点击go,进行搜索 3,出现了Scala IDE4.7X,点击右下方的Install进 ...

  2. Tomcat压缩传输设置

    1.配置位于server.xml文件中的Connector节点下,具体参数如下: 参数 默认值 参数说明 compression off 是否开启压缩传输 compressableMimeType t ...

  3. learning ddr mode register MR2

  4. docker图形化管理工具portainer

    本章主要介绍docker的web图形化管理工具.这里使用 portainer(类似与dockui不过dockerui只支持单节点) 镜像名称 portainer/portainer 一.启动porta ...

  5. mybatis 无法自动补全,没有获得dtd文件

    由于网络原因,eclipse无法下载到http://mybatis.org/dtd/mybatis-3-mapper.dtd,导致eclipse的编辑器无法自动补全标签. 解决办法:将dtd文件下载到 ...

  6. (C/C++学习笔记) 七. 类型转换

    七. 类型转换 ● 隐式类型转换 隐式类型转换 implicit type conversions #include<iostream> using namespace std; void ...

  7. AngularJS输出helloworld

    AngularJS是什么? AngularJS是目前很火的前端JS框架之一, AngularJS的开发团队将其描述为一种构建动态Web应用的结构化框架.它是完全使用JavaScript编写的客户端技术 ...

  8. 201621123001 《Java程序设计》第8周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 Answer: 源 ...

  9. python学习 day01 基础介绍

    一.编程的目的 1.什么是语言?编程语言又为何? 语言是一种事物与另外一种事物沟通的介质.编程语言是程序员和计算机沟通的介质. 2.什么是编程? 程序员把自己想要计算机做的事用编程语言表达出来,编程的 ...

  10. 记一次ios加急上架经历

    https://developer.apple.com//contact/app-store/?topic=expedite app迭代版本上架之前一直好好的没报错,没crash,但是有一次加急上架, ...