poj-3666 【对dp子状态无后效性的理解】
题目链接
错解:
#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子状态无后效性的理解】的更多相关文章
- HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)
HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解) 题意分析 要先排序,在做01背包,否则不满足无后效性,为什么呢? 等我理解了再补上. 代码总览 #in ...
- CodeForces - 714E + POJ - 3666 (dp严格单调递增与非严格单调递增)
左偏树 炒鸡棒的论文<左偏树的特点及其应用> 虽然题目要求比论文多了一个条件,但是……只需要求非递减就可以AC……数据好弱…… 虽然还没想明白为什么,但是应该觉得应该是这样——求非递减用大 ...
- Poj 3666 Making the Grade (排序+dp)
题目链接: Poj 3666 Making the Grade 题目描述: 给出一组数,每个数代表当前位置的地面高度,问把路径修成非递增或者非递减,需要花费的最小代价? 解题思路: 对于修好的路径的每 ...
- Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性
https://codeforces.com/contest/1140/problem/E 局部dp + 定义状态取消后效性 题意 给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字 ...
- [hdu4628 Pieces]二进制子状态,DP
题意:给一个长度为16的字符串,每次从里面删掉一个回文序列,求最少需要几次才能删掉所有字符 思路:二进制表示每个字符的状态,那么从1个状态到另一个状态有两种转移方式,一是枚举所有合法的回文子序列,判断 ...
- poj 1088 滑雪 DP(dfs的记忆化搜索)
题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 ...
- 「POJ 3666」Making the Grade 题解(两种做法)
0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...
- poj上的dp专题
更新中... http://poj.org/problem?id=1037 dp[i][j][0]表示序列长度为i,以j开始并且前两位下降的合法序列数目; dp[i][j][1]表示序列长度为i, 以 ...
- 把一个序列转换成非严格递增序列的最小花费 POJ 3666
//把一个序列转换成非严格递增序列的最小花费 POJ 3666 //dp[i][j]:把第i个数转成第j小的数,最小花费 #include <iostream> #include < ...
随机推荐
- PHP隐藏版本号教程
PHP本身并不启监听服务,所以预防扫描器扫描通过版本号判断漏洞,我们要隐藏的是http头处的版本号,而不是隐藏系统命令行处的版本号. 1.查看当前php版本号 访问一当前服务中的任意页面,截取响应数据 ...
- WebSphere静默安装教程(WAS6.1为例)
1.安装WebSphere 解压守装包: tar -zxf was_soft_64-bit.tar.gz 进入解压出的WAS目录编缉responsefile.nd.txt,将对应选项修值改成以下模样( ...
- linux查看在线用户并踢出用户
linux查看在线用户并踢出用户 1.查看在线用户 w [root@dbserver01 ~]# w 16:45:04 up 16 days, 8:48, 1 user, load average: ...
- linux初始化宏__init, __exit
我们在内核中经常遇到初始化函数是这样定义的:static int __init init_func(); ,与普通函数相比,定义中多了__init.那么,__init是什么意思呢?还有与其匹配的__e ...
- jenkins部署java项目到远程linux(四)
(1)新建java项目(maven构建) pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x ...
- Maven 加载ojdbc14.jar报错,解决方法
因为oracle的ojdbc.jar是收费的,所以maven的中央仓库中没有这个资源,只能通过配置本地库才能加载到项目中去. 首先下载 ojdbc14 https://pan.baidu.com/s ...
- 深入理解java虚拟机---虚拟机工具jstat(十七)
jstack---没什么用 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因 ...
- 关于这次安装Oracle
前后大概经历了一个星期,今天下午(先是用的Navicat)当我尝试性的把用户名上方的复选项从服务名换成SID时,竟然瞬间连接成功了,整个人都是蒙B的,这样就好了? 之后我又用PLsql测试了一下,秒进 ...
- mybatis 异常 There is no getter for property named 'bizId' in 'class java.lang.Long'
mybatis 异常 There is no getter for property named 'bizId' in 'class java.lang.Long' 当使用mybatis进行传参的时候 ...
- <Redis Advance><Pipelining><Memory Optimization><Expire><Transactions>
Overview About Redis pipelining About Redis memory optimization About Redis expire About Redis trans ...