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 ...
随机推荐
- sql语句之随机查询记录和批量插入--基于mysql
本周遇到了好几次数据库方面的问题,一个是上一篇文章提到的因为要修改数据结构引起的在表间复制字段的需求,另一个就是这篇文章要写的:1,从某个数据表中按照某个字段不重复的随机选取几百条记录:2,然后把这些 ...
- 软件设计、DDD概念及落地时的一些零碎思考和记录
DDD理解 DDD体现的是对现实的充分尊重. 1.尊重业务现实,领域专家.领域语言等概念 2.尊重团队现实 3.尊重变化 Application 对某一业务线的整体掌控,流程组装,进度管理,存储时机掌 ...
- 添加树莓派python程序自启动的方法
首先确保网络,硬件连接都正确.保证py程序可以正确运行. 然后远程登录树莓派 打开这个文件来修改自启动,网上有很多方法都是新建一个脚本来完成的.由于我们是自启动python文件,所以命令会有不同. 如 ...
- Express app.listen 函数了解
最近一直在学习如何用原生的 Node.js 来做一个网站.在写的同时也在学习 Express 源码. 一直觉得 Express 开启服务器的方法挺有趣的,就看了一下. 在 Express 运行的时候会 ...
- Hadoop日记Day6---Linux的常用命令
一.系统操作(开机.关机.登陆等)命令 选项名称 使用格式 含义 reboot 输入回车即可 立刻重启 shutdown shutdown –r now 立刻重启 shutdown –r 20: ...
- Android中级教程之----Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一睹为快,希望对大家入门Android Log有一定的帮助. android. ...
- [Direct2D开发] 绘制网格
转载请注明出处:http://www.cnblogs.com/Ray1024 一.引言 最近在使用Direct2D进行绘制工作中,需要实现使用Direct2D绘制网格的功能.在网上查了很多资料,终于实 ...
- shell脚本之基础
配置启动界面 vim /etc/inittab/ init3配置网卡 重启生效system-config-network网卡配置文件vim /etc/sysconfig/network-script ...
- Word或者WPS里证件照的背景底色和像素调整
证件照的背景底色调整和像素调整 关于证件照的背景底色自行调整,比较方便的方法是用Word或者WPS来进行调整,当然也可以利用两者相结合的方法来进行调整,下面来系统的说一下这两种方式.此 ...
- 汉码盘点机PDA无缝对接思迅思迅盘点机思迅条码数据采集器批号商品盘点的方法
1.1. 盘点批号 如果某些商品进行了批号管理,我们不仅仅要清点什么商品总数有多少个,我们还要区分该商品的某个批号有多少个数量,因此以前批号盘点工作量是非常大的. 我们的盘点机PDA支持批号盘点 ...