动态规划总结
DP的定义:
多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化问题的方法为动态规划方法。
DP特性:
无后效性。
DP“外貌”:
头文件
命名空间
创建变量
int main()
{
发热脑门(freopen)
读入(本人习惯用cin + ios::sync_with_stdio(false))
循环(一般是两重(例如01背包)或三重(例如二维费用背包)或更多重for,所以效率不咋地)
{
**变态方程**
}
输出(一般是最后的值)
}
DP适用题目:
可行性,方案数,贪心解决不了的最优值问题。
例子:宁智贤是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如果你是宁智贤,你能完成这个任务吗?
学过DP的大佬(如hzy等)看到这题,一定会说:“这显然是一道01背包啊!”
但是某些people没学过DP(如,如。。。我也举不出来了),会说:“emmm,这道贪心有点恶心那!”,所以这位仁兄会这么打:
/*贪心*/
#include<bits/stdc++.h>
using namespace std;
#define ...... //新手们会说:什么,这是什么高深的函数,我竟然看不懂(其实只是一个宏定义罢了)
int v[i],w[i]......;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i]>>w[i];
(一顿操作猛如虎)
return 0;
}
一看样例:
(什么竟然过了!!!)
提交下试试:(纳尼)
害人的贪心!
而用DP的大佬是这样打的:
#include<bits/stdc++.h>
using namespace std;
int f[101][1001];
int tim[1001],money[101];
int main()
{
int t,n;
scanf("%d%d",&t,&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&tim[i],&money[i]);
for(int i=1;i<=sizeof(f[0]);i++)
f[0][i]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=t;j++)
if(j<tim[i])f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][j],f[i-1][j-tim[i]]+money[i]);
printf("%d",f[n][t]);
return 0;
}
/*
70 3
71 100
69 1
1 2
*/ //什么,这位大佬把数据也拷了
结果:
(big old!!)
分析:
贪心,算法如其名,只顾眼前的利益,在道德上是受谴责的,有些出题人士就是因为厌恶贪心,所以就创造出了DP。
DP存储了所有阶段的最优值,想是一个很大的箱子,把所有最优值存入,最后在最优值中挑出更优。就是答案。所以变态方程(动态转移方程)中少不了max or min 函数。总的来说,就是长大了的贪心,逐渐走向了成熟…(好像扯远了)。总之,这题就是DP(这不很显然吗?)
DP“伙食”:
DP“吃”的很广:如背包,区间…
列成表格为:
文字式:
DP:
背包:01背包,完全背包,混合背包,二维费用背包…
区间DP
二维DP
介绍:
背包:有固定的状态转移方程和固定的循环结构,一般修改时只要对状态转移方程稍加调理即可
外貌:
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
变态方程
区间DP:是DP中最难的一部分(我自认为),循环不固定,最多可达7重,最少也有3重。
外貌:
for(int p=1;p<n;p++)//
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int k=...;
for
if(......)......;
}
二维DP:二维动态规划并不是指动态规划的状态是二维的,而是指线性动态规划的拓展,由线性变为了平面,即在一个平面上做动态规划。
外貌:二维DP变化多端,就举个马拦过河卒吧
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(!g[i][j])
f[i][j] = f[i-1][j]+f[i][j-1];//径数
}
}