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 < ...
随机推荐
- SpringBoot使用Spring Initializer
IDE都支持使用Spring的项目创建Spring的项目创建向导,快速创建一个SpringBoot项目:选择我们需要的模块:向导会联网创建SpringBoot项目:默认生成的SpringBoot项目: ...
- Notes on Large-scale Video Classification with Convolutional Neural Networks
Use bigger datasets for CNN in hope of better performance. A new data set for sports video classific ...
- 2-Servlet和servletContext
2018-08-09 22:34 * Servlet(好好学) * 动态WEB的资源. * 什么是Servlet * 实现Servlet接口,重写5个方法. * S ...
- day04流程控制之while循环
流程控制之while循环 1.什么是while循环 循环指的是一个重复做某件事的过程 2.为何有循环 为了让计算机能像人一样重复 做某件事 3.如何用循环 ''' # while循环的语法:while ...
- Ubuntu下怎么编译并运行C、C++和Pascal语言?
很多同学在安装了Ubuntu的环境后,发现在Windows下的许多东西都打不开了,但是用网站上的在线IDE又不是很方便. 所以,ljn教你如何在Ubuntu下编译并运行C.C++和Pascal. 一. ...
- Animation和Animator 的区别
此文章转载于极视学堂!!!! ①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的. Animation 控制一个动画的播放,而Animator是多个 ...
- redis、memcache、mongoDB 对比
从以下几个维度,对 redis.memcache.mongoDB 做了对比. 1.性能 都比较高,性能对我们来说应该都不是瓶颈. 总体来讲,TPS 方面 redis 和 memcache 差不多,要大 ...
- pymongo 对mongoDB的操作
#文档地址 http://api.mongodb.com/python/current/api/pymongo/collection.html collection级别的操作: find_and _m ...
- java 2D图形绘制
package jisuan; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; imp ...
- tomcat启动失败,提示信息:Unable to ping server at localhost:1099
jdk1.7+maven9.0.0开启服务器时,提示Unable to ping server at localhost:1099 然后换成tomcat8.5.1就成功开启服务器