动态规划浅谈 3/8

前言

 本人爆肝写的这份算法学习笔记,希望对于自己的学习和看到的大佬们有一些帮助,文头说明,如果有错,欢迎在评论区dd我(dd我的请你们吃华伦食堂)

内容简介

1.背包问题   

2.线性动态规划

3.区间类动态规划

4.树型动态规划

5.数位动态规划

6.单调队列优化动态规划

7.状态压缩动态规划

8.斜率优化动态规划

(我这么弱怎么可能一次学完,会缓慢~~(龟速)~~更新,更新完就删去这句话)


------------

背包问题

1.0/1背包

 如果0/1背包还要我告诉你是什么,~~那你退群吧~~左转洛谷网校,里面有专业的导师教导你,%所有洛谷管理员.

  留下一个伪代码就可以结束了吧:
 

for(i=1;i<=n;++i)
  for(j=v;j>=c[i];--j)
        f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+w[i]);

 


2.完全背包

 如果你对于0/1背包理解的比较透彻,那么你一定会研究到为什么第二层循环变量j是逆序循环,其目的在于保证每个物品只会被用一次,所以我们只要改成正序循化就好了,以下是伪代码。

for(int i=1;i<=n;++i)
  for(int j=c[i];j<=v;++j)
    f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+w[i]);


 3.多重背包

 多重背包这种玄学东西,解题策略就是把某件物品可以取x件变成有x件该物品,那么就转化成了0/1背包来解决,当然还有其他的优化做法,等博主变强就来更新。




线性动态规划

 线性动态规划是一类问题。目标函数为特定变量的线性函数,约束是这些变量的线性不等式(standard form)或等式(slack form),目的是求目标函数的最大值或最小值。这类动态规划是平时比较常见的一类动态规划问题。
 
 经典例题:LIS



区间类动态规划

区间类动态规划

适用范围:题目要求将某个区间内的数据合并(或者拆分),以求一个最优解的问题。

按照博主我的理解,事实上区间类动态规划就是线性动态规划的扩展,定义了一个状态f[i][j],表示的是从第i个元素到第j个元素间合并后的最优解(可能是区间内数据和的最大值,可能是合并到一定值的最小次数,因为题目而定),这类动态规划一般比较明显,需要从动态规划起始位置来判断。

接下来是例题

1.[NOI 1995 P1880 石子合并 【普及+/提高-】]

例题解报:[石子合并解报]

2.[P1063 能量项链 【普及+/提高-】]

例题解报:与例题一相似,不做另外解报

------------

## 树型动态规划

TBD

------------

## 数位动态规划

TBD

------------

## 单调队列优化动态规划

TBD

------------

## 状态压缩动态规划

TBD

------------

## 斜率优化动态规划

TBD

------------

END

posted @ 2018-09-26 00:27  Hadesa  阅读(82)  评论(0编辑  收藏  举报