备注:Day1 Day2记得笔记太233,所以就不发了

备注2:Day4~Day7发不发看心情qaq

(7.17持续更新中...)

动态规划A 记忆化搜索 & 动态规划初步

8点15: 杨姓dalao唠叨了几句;8点20:上课正式开始

part1 记忆化搜索

数字金字塔:luogu 1216

一、搜索(dfs)

没一个点向左或向右走

void dfs(int x,int y,int val)
{
val+=a[x][y];
if(x==n-1)
{
if(val>ans)ans=val;
return;
}
dfs(x+1,y,val);
dfs(x+1,y+1,val);
}

二、记忆化搜索:

冗余搜索:无用的,不会改变答案的搜索。

我们在search过程中可能会n次都走到某一个点,其中n-1次搜索即使继续搜索下去,答案也不会改变。

那么,怎么优化程序?对于每一个位置都记录一个值,代表搜到此位置时,最大路径和时多少

void dfs(int x, int y, int val)
{
val += a[x][y];
if(val <= f[x][y]) return;
f[x][y] = val;
if(x == n-1)
{
if(val > ans) ans = val;
return;
}
dfs(x+1, y, val);
dfs(x+1, y+1, val);
}

背包问题:luogu 1048

一、搜索:

状态(x,w,v)——搜到第x件物品,物品总质量w,总价格v

行动——我要不要

约束——物品总质量不超过最大值

目标——物品总价值最大

冗余:(x1,w1,v1)和(x2,w2,v2)时,x1=x2,w1=w2,v1<v2,那么前者冗余

二、记忆化搜索

void dfs(int t,int x,int val)
{
if(val<=f[t][x])return;
f[t][x]=val;
if(x==n)
{
if(val>ans)ans=val;
return;
}
dfs(t,x+1,val);
if(t>=w[x])dfs(t-w[x],x+1,val+v[x]);
}

其实,就是对于冗余的情况不再搜索......(这让我想起了滑雪)

part2.动态规划

在最优路径上走,每走一步都是最大值。

最优性:设走到某一个位置的时候,它达到了路径的最大值,

dp:只记录状态的最优值,并用最优值来推导其他的最优值。

记录f[i][j]路径最大值,有两种方法推导:

顺推;逆推。

数字金字塔:luogu 1216

顺推:f[i][j]->f[i+1][j]、f[i+1][j+1];

逆推:f[i-1][j];f[i-1][j-1]->f[i][j];

    //顺推
f[0][0]=a[0][0];
for(int i=0;i<n-1;++i)
for(int j=0;j<=i;++j)
{
f[i+1][j]=max(f[i+1][j],f[i][j]+a[i+1][j]);
f[i+1][j+1]=max(f[i+1][j+1],f[i][j]+a[i+1][j+1]);
}
//逆推
f[0][0]=a[0][0];
for(int i=0;i<n;++i)
{
f[i][0]=f[i-1][0]+a[i][0];
f[i][i]=f[i-1][i-1]+a[i][i];
for(int j=1;j<i;++j)
f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];
}
ans=0;
for(int i=0;i<n;++i)
ans=max(ans,f[n-1][i]);

状态转移方程

顺推:{fangcheng}

逆推:{fangcheng}

逆推改变搜索顺序

    for(int i=0;i<n;++i)
f[n-1][i]=a[n-1][i];
for(int i=n-2;i>=0;--i)
for(int j=0;j<=i;++j)
f[i][j]=max(f[i+1][j+1],f[i+1][j])+a[i][j];
ans=f[0][0];

这种做法不需要判断边界了

顺推、逆推依个人喜好而定(反正我喜欢逆推??????)

转移顺序:最优值之间的推导顺序

能使用dp做的题:有明确的推导顺序。数字金字塔里就有——自上而下。

能分成不同的阶段,阶段逐步进行。和搜索顺序是类似的

划分好阶段,前往后、后往前推都ok

用一维数组写背包问题

背包 记录f[i][j]:决定前i件物品,在总重量j情况下,物品总价值最大值

状态转移方程:状态之间的推导公式

顺推:我这一个状态,下一步去哪里?

逆推:从什么状态可以到达我这里?

背包 顺推

   for(int i=0;i<n;++i)
for(int j=0;j<=t;++j)
{
f[i+1][j]=max(f[i+1][j],f[i][j]);
if(j+w[i]<=t)
f[i+1][j+w[i]]=max(f[i+1][j+w[i]],f[i][j]+v[i]);
}
ans=0;
for(int i=0;i<=t;++i)ans=max(ans,f[n][i]);

背包 逆推

    for(int i=1;i<=n;++i)
for(int j=0;j<=t;++j)
{
f[i][j]=f[i-1][j];
if(j>=w[i])f[i][j]=max(f[i][j],f[i-1][j-w[i]]+v[i]);
}
ans=0;
for(int i=0;i<=t;++i)ans=max(ans,f[n][i]);

数组压缩:

用一个一维数组代替二维数组

f[i]只由f[i-1]决定,其它的就没用了(优化空间复杂度)

只能倒着枚举了

代码实现

    for(int i=1;i<=n;++i)
for(int j=t;j>=0;--j)
{
//不取:对数组没有影响
//f[i][j]=f[i-1][j];
//取
//if(j>=w[i])f[i][j]=max(f[i][j],f[i-1][j-w[i]]+v[i]);
if(j>=w[i])f[j]=max(f[j],f[j-w[i]]+v[i]);
}

不建议写一维数组,因为有害,空间不够写滚动数组

9点25 课间休息......

9点40 继续上课......

完全背包

poj 1384 http://poj.org/problem?id=1384

完全背包的数组压缩比较简单了for(i=1 to n) for(j=0 to m) if(j>=w[i])f[j]=min(f[j],f[j-w[i]]+p[i];

顺着枚举是完全背包,逆着01

多重背包不要用一维!能用二维干嘛要用一维。。。

背包计数问题:luogu1466 集合

把数字i看成质量i的物品,求出装满重M背包的方案数(然后除以2)

顺推

f[1][0]=1;

for(int i=1;i<=n;i++)

  for(int j=0;j<=m;++j)

  {

    f[i+1][j]+=f[i][j];

    if(i+1<m)f[i+1][i+j]+=f[i][j];

  }

逆推

f[0][0]=1;

for(i=1 to n)

  for(j=0 to m)

   {

     f[i][j]=f[i-1][j]; 

     if(j>=i)f[i][j]+=f[i-1][j-1];

    }

数组压缩

g[0]=1;

for(i=1 to n)

  for(j=m to i)

    g[j] += g[j-i];

luogu 货币系统

10点20下课

10点30上课

多重背包:物品有数量限制

01:只有一件

完全:无数量限制

完全背包

多件物品:拆解成1件物品组成的物品+两件+四件......,单独出售,变成01背包

为什么怎么做呢?因为二进制的神奇功效

【下午做题】

一、洛谷P1004 方格取数

二、导弹拦截

三、合唱队形

四、LCS(LCS转为LIS,用nlog2n解决)

五、LCS洛谷有关例题

待更

帝都Day3——各种dp的更多相关文章

  1. The Last Week

    二轮省选前的最后一周了呢. 一路走到这里,真的很希望能继续走下去. 好好调整一下状态,争取能有机会买D吧(虽然现在似乎D也没什么用了 day1 多项式 多项式ln 多项式exp day2 数据结构 L ...

  2. 动态规划基础复习 By cellur925

    结束帝都的qbxt dp图论精讲班后,感觉自己依然很水,接下来的一周,不妨来复习一下讲课内容:) 动态规划是lyd讲的,上次在泉城讲数据结构,然鹅体验较差,这次虽说好了些,但还是比想象中的效果不好(还 ...

  3. CCPC-Wannafly Winter Camp Day3 Div1 - 精简改良 - [生成树][状压DP]

    题目链接:https://zhixincode.com/contest/14/problem/D?problem_id=206 样例输入 1  5 5 1 2 1 1 3 1 2 4 1 2 5 1 ...

  4. 【CCPC-Wannafly Winter Camp Day3 (Div1) D】精简改良(状压DP)

    点此看题面 大致题意: 给你一张图,定义\(dis(i,j)\)为\(i\)与\(j\)的最短距离,现要求删去若干条边,使得图仍然联通,且\(\sum_{i=1}^n\sum_{j=i+1}^ndis ...

  5. 帝都Day4(1)——还是dp

    其实是day4 一.洛谷P1018 乘积最大 f[i][j]表示前i个数 切成j块 用f[i][j]而不用f[i][j][k](i到j切成k块)呢? Luogu1043 前缀和(好算一段里的数的和)+ ...

  6. 牛客国庆集训派对Day3 B Tree(树形dp + 组合计数)

    传送门:https://www.nowcoder.com/acm/contest/203/B 思路及参考:https://blog.csdn.net/u013534123/article/detail ...

  7. 清北学堂dp图论营游记day3

    .状态压缩dp: 对于这个我们引入二进制状态压缩,因为任何一个数都可以二进制表示,而其二进制表示上每一位都可以表示当前位置是否有元素,这就构成了状态压缩. 对于这个题,上下行&一下就行. 状压 ...

  8. 暑期培训7日游解题思路(day1~day3)

    暑期培训7日游解题思路(day1~day3) day1 第一天,王聿中老师出的题目比较简单,T1很水,T2是个简单的DP,T3还是有一点意思的.在网格图中删掉若干条边,使得所有格子都联通,求删掉的边的 ...

  9. 纪中2018暑假培训day3提高a组改题记录(混有部分b组)

    day3 模拟赛,看了看a组题,发现是博弈论,非常开心(因为好玩),于是做的a组.结果差点爆零,死命纠结t1的sg函数,但其实只是一个dp,不用扯到sg函数的那种. t1: Description 被 ...

随机推荐

  1. PHP使用http_build_query()构造URL字符串的方法

    http_build_query http_build_query -- 生成 url-encoded 之后的请求字符串描述string http_build_query ( array formda ...

  2. codeforces 707A A. Brain's Photos(水题)

    题目链接: A. Brain's Photos 题意: 问是黑白还是彩色; 思路: 没有思路: AC代码: #include <iostream> #include <cstdio& ...

  3. 【二叉查找树】03验证是否为二叉查找树【Validate Binary Search Tree】

    本质上是递归遍历左右后在与根节点做判断,本质上是后序遍历 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  4. ffmpeg处理RTMP流媒体的命令和发送流媒体的命令(UDP,RTP,RTMP)

    将文件当做直播送至live ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName     re限制输出速率, ...

  5. ACM学习历程—51NOD1028 大数乘法V2(FFT)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 题目大意就是求两个大数的乘法. 但是用普通的大数乘法,这 ...

  6. [转]HTTP Header 详解

    HTTP Header 详解 HTTP(HyperTextTransferProtocol) 即超文本传输协议,目前网页传输的的通用协议.HTTP协议采用了请求/响应模 型,浏览器或其他客户端发出请求 ...

  7. Python:urllib模块的urlretrieve方法

    转于:https://blog.csdn.net/fengzhizi76506/article/details/59229846 博主:fengzhizi76506 1)功能: urllib模块提供的 ...

  8. vue 给嵌套的iframe子页面传数据 postMessage

    Vue组件下嵌套了一个不同域下的子页面,iframe子页面不能直接获取到父页面的数据,即使数据存在localStorage中,子页面一样是获取不到的,所以只好使用postMessage传数据: < ...

  9. Web Pages(单页面模型)

    .NET 是一套框架,用来个HTML.JS.CSS和服务器端脚本构建网页和网站. 可以有三种开发模式:Web Pages(单页面模型).MVC(模型视图控制器).Web Forms(事件驱动模型) W ...

  10. Unusual Sequences

    题意: 求解合为 y 的总体 gcd 为 x 的正整数非空序列个数. 解法: 特判一下后,原问题等价于合为 s = y/x 的整体gcd为1的正整数序列个数. 1.$ans = \sum_{\sum{ ...