最近正儿八经的学习了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. 20155202张旭 Exp3 免杀原理与实践

    20155202张旭 Exp3 免杀原理与实践 AV厂商检测恶意软件的方式主流的就三种: 基于特征码的检测 启发式恶意软件检测 基于行为的恶意软件检测 我们要做的就是让我们的恶意软件没法被这三种方式找 ...

  2. 实践:IIS7下访问ashx页面,显示404

    问题描述 1.路径什么的都对,这方面的原因就不要想了 2.在我的电脑上可以,在同事的电脑上不可以 方案1:未注册ashx的处理应用程序 也就是不知道IIS不知道用什么应用程序处理ashx文件,解决办法 ...

  3. WebService快速上手

    一.WebService是什么? 核心特征:跨语言.跨平台.远程调用[如果是本地系统交互,使用rpc或者com技术就行] soap:HTTP + XML [基于Http的xml格式数据交互] wsdl ...

  4. PowerBI开发 第十一篇:报表设计技巧(更新)

    PowerBI版本在持续的更新,这使得报表设计能够实现更多新的功能,您可以访问 PowerBI Blog查看PowerBI的最新更新信息,本文总结了PowerBI新版本的重要更新和设计技巧. 我的Po ...

  5. 在Windows商店应用中使用浅色主题

    在开发商店应用时会遇到这样的情况,设计师给我们的设计是浅色背景/深色文本,而商店应用默认是深色背景/浅色文本.那我们需要在每个页面去显式声明背景色和前景色吗,这显然是不理想的.这时就需要设置应用的主题 ...

  6. 高精度减法--C++

    高精度减法--C++ 仿照竖式减法,先对其,再对应位相减. 算法处理时,先比较大小,用大的减小的,对应位再比较大小,用于作为借位符. #include <iostream> #includ ...

  7. 记录Jenkins+gitlab+maven

    摘要 昨天抽空将jenkins+gitlab(git)+maven整合了一下,再次记录一下以防下次再去查找省的麻烦. git.maven.java配置 启动jenkins之后进入系统管理里面的Glob ...

  8. CentOS7安装OpenStack(Rocky版)-02.安装Keyston认证服务组件(控制节点)

    本文分享openstack的认证服务组件keystone --------------- 完美的分割线 ---------------- 2.0.keystone认证服务 1)用户与认证:用户权限与用 ...

  9. Call actvity after viewpager is finished

    private OnPageChangeListener mListener = new OnPageChangeListener() { @Override public void onPageSe ...

  10. App云测试服务对比

    前言: 我们都知道在测试移动app时最耗时的是在各种测试设备进行测试, 因为不论是安卓还是iOS都已经碎片化了.而云测试看似是解决这一问题的有效途径.因此选择哪种云测试平台来协助测试人员进行各种测试就 ...