动态规划总结

动态规划总结

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];//径数
        }
    }
==================================================================================(我是一条分割线^_)

总结完毕,谢谢观看

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值