目录
(如果想看递归写法可以到我的记忆化递归里去看看记忆化递归_将递归程序记忆化-优快云博客)
1.动态规划的介绍
是解决多阶段决策问题常用的最优化理论,该理论由美国数学家Bellman等人在1957年提出,用于研究多阶段决策过程的优化问题。
动态规划方法的原理就是把多阶段决策过程转化为一系列的单阶段决策问题,利用各个阶段之间的递推关系,逐个确定每个阶段的最优化决策,最终堆看出多阶段决策的最优化决策结果。
动态规划适合求解多阶段(状态转换)决策问题的最优解,决策的阶段可以随时间划分也可以随着问题的演化状态划分。问题都具有的一个性质就是“最优子结构”。
而动态规划的重点就是在于找出状态转移方程。
接下来我们看几道例题
2.动态规划的例题
第1道题 数字三角形
(如果想看递归写法可以到我的记忆化递归里去看看记忆化递归_将递归程序记忆化-优快云博客)
数字三角形的洛谷链接:[USACO1.5] [IOI1994]数字三角形 Number Triangles - 洛谷
这道题问的就是怎样走可以数字和最大(一棵树);
这道题思路很简单,我们可以从这棵树的底部开始进行运算,比大小。
所以我们的动态转移方程就是:d[i][j] = a[i][j]+max(d[i+1][j],d[i+1][j+1]);//它等于它底下的节点中的最大值加上本身
最后代码:
#include <bits/stdc++.h>
using namespace std;
int d[1005][1005];
int a[1005][1005];
int n;
int main(){
cin >> n;
for (int i =1; i <= n+1; i++){
for (int j =1; j <= i; j++){
cin >> a[i][j];
}
}
for (int j =1; j <= n; j++){
d[n][j] = a[n][j];
}
for (int i =n-1; i >= 1; i--){
for (int j =1; j <= i; j++){
d[i][j] = a[i][j]+max(d[i+1][j],d[i