动态规划入门-数字三角形
来源:互联网 发布:淘宝借呗 编辑:程序博客网 时间:2024/06/16 05:07
假设有一组数字三角形,
2 6 2 1 8 41 5 6 8
由一个数字可以到下一层的左或右,求一条最短的路径.
使用动态规划
自顶向下考虑,如果要使到达[i,j]最短,则必须选择达到[i-1,j],[i-1,j-1]中较短的一条路径
因此有dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]) + mat[i][j]
而dp[1][1]
初始化为2
自底向上考虑,dp[i][j]
的最短路径应当包含dp[i+1][j]
或dp[i+1][j+1]
的最短路径,因此有dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]) + mat[i][j]
C++代码
#include "bits/stdc++.h"using namespace std;#define inf 0x3f3f3f3fint main(int argc, char const *argv[]){ freopen("dp1.txt", "r", stdin); /* 2 6 2 1 8 4 1 5 6 8 */ int i,j, n; cin >> n; int mat[n+1][n+1], dp[n+1][n+1]; memset(dp, inf, sizeof(dp)); for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ cin >> mat[i][j]; } } // 由上向下递推 以最短的路径到达i,j //dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1]) + mat[i][j] dp[1][1] = mat[1][1]; for(i=2;i<=n;i++){ for(j=1;j<=i;j++){ dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1]) + mat[i][j]; } } /* 2 8 4 9 12 8 10 14 14 16 */ memset(dp, inf, sizeof(dp)); for(j = 1; j<=n; j++) dp[n][j] = mat[n][j]; //由下向上递推 到达i,j后选择最短的路径 //dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + mat[i][j]; for(i=n-1; i>0; i--){ for(j=1; j<=i; j++){ dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + mat[i][j]; } } /* 10 8 12 2 13 10 1 5 6 8 */ return 0;}
阅读全文
0 0
- 数字三角形--- 动态规划入门
- 动态规划入门-数字三角形
- 动态规划入门 数字三角形
- Tyvj1044数字三角形(动态规划入门)
- 动态规划(入门):各种数字三角形
- 动态规划----数字三角形
- 数字三角形 动态规划
- 动态规划:数字三角形
- 动态规划--数字三角形
- 动态规划--数字三角形
- 动态规划-数字三角形
- 数字三角形--动态规划
- 动态规划&数字三角形
- 动态规划 数字三角形
- 动态规划 数字三角形
- 动态规划:数字三角形
- 动态规划 数字三角形
- 动态规划-数字三角形
- Python常用库大全
- RxJS
- linux下的守护进程
- 【Leetcode】【python】Balanced Binary Tree
- numpy.searchsorted 用法
- 动态规划入门-数字三角形
- 【Leetcode】【python】Minimum Depth of Binary Tree
- 码云,git使用 教程
- Java编程入门基础笔记-New
- 以后 博文 要做 中文对照,利于国际化,利于自己熟悉英语。
- uva679
- 【文献阅读】dropout distillation
- Vue进阶-入门
- Making the Grade (bzoj1592)