「学习笔记」动态规划的引入

一.什么是动态规划#

动态规划是一种重要的思维方法,通过利用已有的子问题信息高效求出当前问题的最优解。

由于动态规划并不是某种具体的算法,而是一种解决特定问题的方法,因此它会出现在各式各样的数据结构中,与之相关的题目种类也更为繁杂。

二.动态规划基础#

一般的,对于解决动态规划的题目,有以下三个步骤:

  • 1.根据题目设计状态,初始化状态。
  • 2.根据状态,推导转移方程。(也就是考虑如何从 i1 转移到 i
  • 3.确定最优解,求出答案。

而动态规划与贪心算法本质上的区别在于:贪心算法算出的是局部最优解,而动态规划算出的是全局最优解。所以我们要认真读题,避免判断错误。

三.基本例题入门#

  • P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles#

    读题,按照上文分 3 步:
    • 1.设立状态: dpi,j 表示从起点到点 i,j 的最大价值,初始化 dp1,1=a1,1
    • 2.推导转移方程:发现当前的 dpi,j 有两条路可以得到:从点 i1,j1 或点 i1,j,也就是当前点上一层的两个点。于是转移方程为 dpi,j=max(dpi1,j,dpi1,j1)+ai,j
    • 3.确定最优解:题目要求求到达最底层所获得的最大值。根据我们设计的状态,也就是求 max(dpr,i)
      代码如下:
    Copy
    #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e3 + 7; int dp[N][N], n, a[N][N]; int main () { cin >> n; for (int i = 1; i <= n; i ++) { for (int j = 1; j <= i; j ++) { cin >> a[i][j]; } } for (int i = 1; i <= n; i ++) { for (int j = 1; j <= i; j ++) { dp[i][j] = max (dp[i - 1][j], dp[i - 1][j - 1]) + a[i][j]; } } int ans = 0; for (int i = 1; i <= n; i ++) { ans = max (ans, dp[n][i]); } cout << ans; return 0; }
posted @   cyhyyds  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
CONTENTS