最近正儿八经的学习了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范畴)内的应用的更多相关文章

  1. dp乱写1:状态压缩dp(状压dp)炮兵阵地

    https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...

  2. dp乱写3:环形区间dp(数字游戏)

    状态: fmax[i,j]//表示前i个数分成j个部分的最大值 fmin[i,j]//表示前i个数分成j个部分的最小值 边界:fmax[i,1]:=(sum[i] mod 10+10) mod 10( ...

  3. HDU 4640 状态压缩DP 未写完

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...

  4. 【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)

    ACM字符串 .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 ...

  5. [BZOJ4011][HNOI2015]落忆枫音-[dp乱搞+拓扑排序]

    Description 传送门 Solution 假如我们的图为DAG图,总方案数ans为每个点的入度In相乘(不算1号点).(等同于在每个点的入边选一条边,最后一定构成一棵树). 然而如果加了边x- ...

  6. [CSP-S模拟测试]:军训队列(DP+乱搞)

    题目描述 有$n$名学生参加军训,军训的一大重要内容就是走队列,而一个队列的不规整程度是该队中最高的学生的身高与最矮的学生的身高差值的平方.现在要将$n$名参加军训的学生重新分成$k$个队列,每个队列 ...

  7. C语言--乱写C语言

    C语言的语法太枯燥了 换个写法   #include <stdio.h> #include<stdlib.h> #define end } #define if(x) if ( ...

  8. android中dx、dp、dip、sp单位的区别

    1.dp=dip 2.px基于像素,后两者基于像素密度. 3.px既可用于宽度高度,也可用于字体,dp用于宽高,sp用于字体4.android中以320*480屏幕为基准.在相同值的px和dp,在32 ...

  9. 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 ...

随机推荐

  1. 大数据入门第十八天——kafka整合flume、storm

    一.实时业务指标分析 1.业务 业务: 订单系统---->MQ---->Kakfa--->Storm 数据:订单编号.订单时间.支付编号.支付时间.商品编号.商家名称.商品价格.优惠 ...

  2. ASP HUOSHAN VIDEO

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  3. 20155229《网络对抗技术》Exp3:免杀原理与实践

    实验预习 免杀: 看为一种能使病毒木马避免被杀毒软件查杀的技术. 免杀的分类: 开源免杀:指在有病毒.木马源代码的前提下,通过修改源代码进行免杀.. 手工免杀:指在仅有病毒.木马的可执行文件(.exe ...

  4. mfc 类三种继承方式下的访问

    知识点 public private protected 三种继承方式 三种继承方式的区别 public 关键字意味着在其后声明的所有成员及对象都可以访问. private 关键字意味着除了该类型的创 ...

  5. linux 升级 5.0.2内核

    1.下载 wet https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.2.tar.xz -o /usr/src/ cd /usr/src ta ...

  6. springboot项目生成jar包(带静态资源)方法

    [Maven]在pom.xml文件中使用resources插件的小作用 不过war包比较实用,毕竟独立的tomcat比较好控制

  7. 后端自动构建前端css和js

    引子: 别的复杂前端开发技术不会,用得多的还是手写代码,手动处理. 3年前手写合并压缩js和css文件的asp脚本代码目前还能正常运行,也就没有多大使用别的技术的动力. 直到近期被一个问题纠结着,今天 ...

  8. Js_特效

    事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture();  event.srcE ...

  9. Js_图片轮换

    本文介绍用javascript制作图片轮换效果,原理很简单,就是设置延时执行一个切换函数,函数里面是先设置下面的缩略图列表的白框样式,再设置上面大图的src属性,在IE中显示很正常,可是在FF中会有变 ...

  10. 代理神器allproxy

    背景 allproxy意为all as proxy,即是说所有设备均可以成为一个网络代理,唯一的要求就是有网络访问权限. 一般的代理软件要求宿主机必须有公网地址,然后才能把网络代理出去,但在实际情况下 ...