dp乱写2:论dp在不在dp中(但在dp范畴)内的应用
最近正儿八经的学习了dp,有一些题目非常明显看出来就是dp了
比如说:过河卒、方格取数、导弹拦截、加分二叉树、炮兵阵地
更加明显的还有:采药、装箱问题、过河、金明的预算方案。
今天来谈谈dp的dp在不在dp中(但在dp范畴)内的应用(简称dp的应用)
dp其实可以用贪心来优化,有些基本不可能的情况就可以直接省略了。
dp其实可以用数据结构来优化,取最大值最小值用堆。。。
dp其实不一定是dp,也可以是一种思想,的简称dp思想,
就是用前面的一个或者两个状态来推出现在状态的可能,解决一些问题有神效。
dp的空间基本上是n^2或者m^2(用滚存也是少数啊3转2其实也可以滚的啊)
如果看到n=1,000;m=1,000的数据范围就想到dp啦。
但是问题来了,不是每一题符合从前推到后且n,m比较小的题目就是dp。
但是用dp思想一定没错啦。。。
下面有个小例子来阐述一下p在不在dp中(但在dp范畴)内的应用(简称dp的应用)
【题目名称】游览(sightseeing.pas/c/cpp)
【题目描述】周末到了,gnocuil打算去逛游乐园。他所去的游乐园可以看做一个N*M的网格,每个网格上都是一个景点。游乐园的入口在(1,1),出口在(N,M)处。游乐园有一个不成文的规定:游览时,只能朝着坐标增大的方向走,因为如果坐标减小,会很不吉利。换句话说,每次只能向右方、正下方走。当然,只可以走到相邻的景点,不可以沿着斜线走。
对于走到的每个景点,gnocuil都会得到一个快乐度A[i,j]。同时,游览会使他疲倦,每个景点都会使他增加B[i,j]的疲劳度。
gnocuil认为,对于每次游览,用总快乐度除以总疲劳度,得到的就是这次游览的价值。请你设计一个方案,使得对于给定的游乐园信息,游览的价值最大。
【输入文件】第一行是两个整数N,M,表示游乐园的大小。
接下来N行每行M个正整数,表示这个景点的快乐度。
接下来N行每行M个正整数,表示这个经典的疲劳度。
【输出文件】只有一个实数,表示最大价值。精确到小数点后5位小数。
【输入样例】
2 2
1 2
1 1
1 1
2 1
【输出样例】
1.33333
【样例说明】只有两条线路:(1,1)->(1,2)->(2,2)的价值是(1+2+1)/(1+1+1)=1.33333,(1,1)->(2,1)->(2,2)的价值是(1+1+1)/(1+2+1)=0.75000。
【图】自己画啦。
现在我要阐述的是这题怎么用dp(思想)来解题。
首先,直接DP显然错误,因为(A1+A2)/(B1+B2)不可能被分解成A1/B1和A2/B2的形式。
一个反例见测试点2:
input#2
5 5
3 5 4 4 4
4 3 4 4 4
4 3 3 3 4
5 5 3 5 5
3 5 5 4 5
1 1 1 1 2
2 1 2 2 2
1 1 2 1 1
2 2 2 1 2
2 1 1 2 1
output#2
3.45454
这不是一个luo的坐标dp,如果不能dp,那还玩个毛线?(放弃)
其实我们仔细分析还是可以用dp的思路给出解答。
本题求的是:max(∑Ai/∑Bj)。设max (∑Ai/∑Bj)=k,即对于最优解, ∑Ai=k∑Bj
也就是Max k,k满足 ∑(Ai-kBj)=0;
换句话说,因为Ai和Bj是给定的,只要对于某个答案k,得到上式=0,就可以断定k是合法的答案。在此基础上求出最大的合法的k。
怎样确定答案k?
枚举!只需二分k,再进行判断即可。
二分k的过程中,如果k偏小,就会有 max(∑Ai/∑Bj)>k,也就是∑(Ai-kBj)>0 反之亦然。
也就是说我们每次二分答案的时候还是需要用到坐标dp的(套路深~~)
假设f[i,j]表示∑(Ai-kBj)的最大值(走到(i,j)时得到的价值的最大值)
for i:= to n do
for j:= to m do
f[i,j]:=max(f[i-,j],f[i,j-])+a[i,j]-k*b[i,j];
这个状态转移真心不难啊!!!
然后就可以愉快的二分了。(注意double二分格式,最后输出l)
var n,m,i,j:longint;
f:array[..,..]of double;
a,b:array[..,..]of longint;
l,r,mid:double;
function max(a,b:double):double;
begin
if a>b then exit(a)
else exit(b);
end;
function pd(k:double):boolean;
var i,j:longint;
begin
for i:= to n do
for j:= to m do
f[i,j]:=max(f[i-,j],f[i,j-])+a[i,j]-k*b[i,j];
exit(f[n,m]>);
end;
begin
assign(input,'sightseeing.in');
assign(output,'sightseeing.out');
reset(input);
rewrite(output);
readln(n,m);
for i:= to n do
for j:= to m do
read(a[i,j]);
for i:= to n do
for j:= to m do
read(b[i,j]);
for i:= to n do f[i,]:=-1e300;
for j:= to m do f[,j]:=-1e300;
f[,]:=;
l:=; r:=;
while r-l>1e- do begin
mid:=(l+r)/;
if pd(mid)then l:=mid
else r:=mid;
end;
writeln(l::);
close(input);
close(output);
end.
dp乱写2:论dp在不在dp中(但在dp范畴)内的应用的更多相关文章
- dp乱写1:状态压缩dp(状压dp)炮兵阵地
https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...
- dp乱写3:环形区间dp(数字游戏)
状态: fmax[i,j]//表示前i个数分成j个部分的最大值 fmin[i,j]//表示前i个数分成j个部分的最小值 边界:fmax[i,1]:=(sum[i] mod 10+10) mod 10( ...
- HDU 4640 状态压缩DP 未写完
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...
- 【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)
ACM字符串 .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 ...
- [BZOJ4011][HNOI2015]落忆枫音-[dp乱搞+拓扑排序]
Description 传送门 Solution 假如我们的图为DAG图,总方案数ans为每个点的入度In相乘(不算1号点).(等同于在每个点的入边选一条边,最后一定构成一棵树). 然而如果加了边x- ...
- [CSP-S模拟测试]:军训队列(DP+乱搞)
题目描述 有$n$名学生参加军训,军训的一大重要内容就是走队列,而一个队列的不规整程度是该队中最高的学生的身高与最矮的学生的身高差值的平方.现在要将$n$名参加军训的学生重新分成$k$个队列,每个队列 ...
- C语言--乱写C语言
C语言的语法太枯燥了 换个写法 #include <stdio.h> #include<stdlib.h> #define end } #define if(x) if ( ...
- android中dx、dp、dip、sp单位的区别
1.dp=dip 2.px基于像素,后两者基于像素密度. 3.px既可用于宽度高度,也可用于字体,dp用于宽高,sp用于字体4.android中以320*480屏幕为基准.在相同值的px和dp,在32 ...
- android: android中dip、dp、px、sp和屏幕密度
android中dip.dp.px.sp和屏幕密度 转自:http://www.cnblogs.com/fbsk/archive/2011/10/17/2215539.html 1. dip: dev ...
随机推荐
- 经常使用命令 echo、@、call、pause、rem
经常使用命令 echo.@.call.pause.rem(小技巧:用::取代rem)是批处理文件最经常使用的几个命令,我们就从他们開始学起. 首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标 ...
- 20155204《网络对抗》Exp8 Web基础
20155204<网络对抗>Exp8 Web基础 一.基础问题回答 1.什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用C ...
- 20155216 Exp8 WEB基础实践
Exp8 WEB基础实践 实践内容 Apache环境配置 apache是kali下的web服务器,通过访问 ip地址+端口号+文件名称 打开对应的网页. 输入命令 vi /etc/apache2/po ...
- 2017-2018-2 《网络对抗技术》20155322 Exp9 web安全基础
[-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-HTML 2.2-Injection Flaws 2.3-XSS 2.4-CSRF ...
- 蒙特卡罗方法 python 实现
蒙特卡罗(Monte Carlo)方法的精髓:用统计结果去计算频率,从而得到真实值的近似值. 一.求圆周率的近似值,采用 投点法 import numpy as np import matplotli ...
- CS100.1x Introduction to Big Data with Apache Spark
CS100.1x简介 这门课主要讲数据科学,也就是data science以及怎么用Apache Spark去分析大数据. Course Software Setup 这门课主要介绍如何编写和调试Py ...
- 利用 jrebel 热部署\远程调试\远程热部署 springboot项目 服务器上的代码
首先要在eclipse 中启用 启用以后在 resource 中生成了 rebel-remote.xml 然后build,把生成的jar包放到服务器上. 然后用下面的命令启动 java -agentp ...
- 移动端H5页面上传图片或多张图片
传统PC网页上传文件,大家都已经熟悉,这里不做介绍. 本文简单介绍移动端常用上传图片功能.灵活使用轮询或长连接可实现PC与移动端数据同步,即PC端需要上传的图片是移动拍照下来或移动端硬盘储存的,不需要 ...
- Zabbix使用总结
1. CentOS 7上启动zabbix-server失败,/var/log/messages中的报错信息如下: Feb :: mysql-server1 systemd: Starting Zabb ...
- Git管理多个SSH密钥,Git多帐号配置
版权声明:转载须标明本文转自严振杰的博客 https://blog.csdn.net/yanzhenjie1003/article/details/69487932版权声明:转载必须注明本文转自严振杰 ...