基本概念

动态规划是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。

动态规划基本思想

动态规划算法通常用于求解具有某种最优性质的问题。
基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

步骤

  1. 找出最优解的性质,并刻画其结构特征
  2. 递归地定义最优值(写出动态规划方程);
  3. 以自底向上的方式计算出最优值;
  4. 根据计算最优值时得到的信息,构造一个最优解。

步骤1~3是动态规划算法的基本步骤。
在只需要求出最优值的情形,步骤4可以省略;
若需要求出问题的一个最优解,则必须执行步骤4。

备忘录算法

备忘录方法是动态规划算法的变形。
与动态规划算法一样,备忘录方法用一个表格保存已解决的子问题的答案,再碰到该子问题时,只要简单地查看该子问题的解答,而不必重新求解。
备忘录方法的控制结构与直接递归方法的控制结构相同,区别仅在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解(减少了递归调用的次数,提高运行效率)。

过河卒

总时间限制: 1000ms 内存限制: 128000kB

描述

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1中的C点和P1,……,P8,卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在要求你计算出卒从A点能够到达B点的路径的条数。

输入
B点的坐标(n,m)以及对方马的坐标(X,Y)
输出
从A点能够到达B点的路径的条数。

样例输入
6 6 3 2

样例输出
17

来源
noip普及组2002

#include<iostream>
using namespace std;
long long fun(long long n,long long m, long long x, long long y){long long a[21][21];int dx[9] = {0, 2, 2, 1, 1, -2, -2, -1, -1};int dy[9] = {0, 1, -1, 2, -2, 1, -1, 2, -2};bool g1[21][21];fill(g1[0],g1[0]+21*21,true);for (int i=0; i<=8; i++){int xx=x+dx[i],yy=y+dy[i];if (xx>=0 && xx<=n && yy>=0 && yy<=m){g1[xx][yy]=false;} }// for(int g=0; g<=n; g++)// {//     for(int h=0; h<=m; h++)//     {//         cout<<g1[g][h]<<" "; //     }//     cout<<endl;// }fill(a[0],a[0]+21*21,0);a[0][0]=1LL;for(int g=0; g<=n; g++){for(int h=0;h<=m;h++){if(g1[g][h]){if(g==0&&h>=1){a[0][h]=a[g][h-1]; }if(h==0&&g>=1){a[g][0]=a[g-1][h]; }if(g>=1&&h>=1){   a[g][h] = a[g-1][h]+a[g][h-1];} }}}// cout<<endl;// for(int g=0; g<=n; g++)// {//     for(int h=0;h<=m;h++)//     {//         cout<<"("<<g<<","<<h<<"):"<<a[g][h]<<" "; //     }//     cout<<endl;// }return a[n][m];
}
int main(){long long n,m,x,y;cin>>n>>m>>x>>y;cout<<fun(n,m,x,y)<<endl;return 0;
}

踩坑日志
数据类型需要long long, 赋初值 需要加LL

矩阵连乘

#include<iostream>
#include<cstring>using namespace std;
#define NUM 51int main(){int n = 6;int m[n+1][n+1];int s[n + 1][n + 1];memset(m, 0, sizeof(m));memset(s, 0, sizeof(s));int p[7] = {50, 10, 40, 30, 5, 20, 15};for (int i = 1; i <= n; i++){m[i][i] = 0;}cout << endl;for (int r = 2; r <= n; r++){int j=r;for (int i = 1; i <= n - r + 1; i++){m[i][j] = m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];s[i][j] = i;for (int k = i; k < j; k++){int t = m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];if (t < m[i][j]) {m[i][j] = t;s[i][j] = k;}}j++;}cout << endl;}for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){cout << m[i][j] << " ";}cout << endl;}for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){cout << s[i][j] << " ";}cout << endl;}return 0;
}

递归实现矩阵连乘

#include<iostream>
#include<cstring>
using namespace std;
int s[100][100];
int p[100];
int m[100][100];
int Recurve(int i, int j)
{int n;if(i==j){return 0;}m[i][j] = Recurve(i, i) + Recurve(i+1, j) + p[i - 1] * p[i] * p[j];s[i][j] = i;for (int k = i+1; k < j;k++){n = Recurve(i, k) + Recurve(k+1, j) + p[i - 1] * p[k] * p[j];if(n<m[i][j]){m[i][j] = n;s[i][j] = k;}}return m[i][j];
}
// int Recurve(int i, int j){//     if (i == j){//         return 0;
//     }//     int u = Recurve(i, i)+Recurve(i+1,j)+p[i-1]*p[i]*p[j];
//     s[i][j] = i;//     for (int k = i+1; k<j; k++) {//         int t = Recurve(i, k) + Recurve(k+1,j)+p[i-1]*p[k]*p[j];
//         if (t<u)
//         {
//             u = t; s[i][j] = k;
//         }
//     }
//     m[i][j] = u;
//     return u;
// } int main(){int n = 6;memset(m, 0, sizeof(m));memset(s, 0, sizeof(s));for (int i = 0; i <= n; i++){cin >> p[i];}cout << Recurve(1, n) <<endl;cout << m[1][n] <<endl;for (int i = 1; i <= n;i++){for (int j = 1; j <= n;j++){cout << m[i][j] << " ";}cout << endl;}for (int i = 1; i <= n;i++){for (int j = 1; j <= n;j++){cout << s[i][j] << " ";}cout << endl;}return 0;
}

背包问题

0-1背包

#include<iostream>
using namespace std;
#define NUM 2001
int f[NUM];
int c[NUM];
int w[NUM];
int n;
int m;
int main(){cin >> m >> n; // 容量m 物品件数nfor (int i = 1; i <= n; i++){cin >> w[i] >> c[i];}for (int i = 1; i <= n; i++){for (int v = m; v >= w[i];v--){if(f[v]<f[v-w[i]]+c[i]){f[v] = f[v - w[i]] + c[i];}}}for (int i = 1; i <= m;i++){cout << f[i] << " ";}return 0;
}

完全背包

#include<iostream>
using namespace std;
#define NUM 2001
int f[NUM];
int c[NUM];
int w[NUM];
int n;
int m;
int main(){cin >> m >> n; // 容量m 物品件数nfor (int i = 1; i <= n; i++){cin >> w[i] >> c[i];}for (int i = 1; i <= n; i++){for (int v = w[i]; v <= m;v++){if(f[v]<f[v-w[i]]+c[i]){f[v] = f[v - w[i]] + c[i];}}}for (int i = 1; i <= m; i++){cout << f[i] << " ";}return 0;
}

算法分析与设计C++ 第四章:动态规划 (附4:过河卒)相关推荐

  1. 算法分析与设计(第四章 贪心法(局部最优))

    1.基本思想:贪心法通过分步决策的方法求解问题.贪心法每一步用作决策依据的选择准则称为最优量度标准(局部最优解).在根据最优量度标准选择分量的过程中,还需要使用一个可行解判定函数(约束条件). 2.贪 ...

  2. 算法复习第四章动态规划

    算法复习第四章动态规划 动态规划 TSP问题 0-1bag 动态规划 TSP问题 0-1bag 最长公共子序列不考:

  3. 数字图像处理学习笔记4第四章 图像变换 附实验

    第四章 图像变换 附实验 前言 图像变换:为达到某种目的将原始图像变换映射到另一个空间上,使得图像的某些特征得以突出,以便于后面的处理和识别. 4.1连续傅里叶变换 一维变换 用傅里叶变换表示的函数特 ...

  4. C++ API 设计 09 第四章 设计

    第四章 设计 上个章节是为开始设计API打下基础和准备必要的开发背景知识.我分析了各种对API设计有益的品质和讲解了应用于可维护的API设计的标准设计模式. 本章将把这些信息全部整合到一起,涵盖高品质 ...

  5. 设计美学 第四章 技术革命与设计革命

    文章目录 1 技术革命与设计革命 1.1技术与设计的关系 1.2技术革命对设计的影响 1.3技术基础与审美范型 2 古代技术革命 3 古典设计 3.1东方建筑中的古典设计 3.2西方建筑中的古典设计 ...

  6. 算法分析与设计第十四次作业(leetcode中Cherry Pickup题解)

    题解正文 题目描述 问题分析 此题给出一个n乘n矩阵,矩阵中值可以是0/1/-1. 要求我们找出从(0,0)出发,到(n-1,n-1),然后回到(0,0)的路径,要求往程只能向右向下,而返程只能向左向 ...

  7. Linux下pl与ps端的通信,Overlay设计方法篇之第四章PS与PL的交互

    Overlay由两个主要部分组成--bitstream文件和hwh(Hardware Handoff)文件.可以说Overlay设计其实就是一种PL与PS的交互设计.通常PL设计针对特定任务进行高度优 ...

  8. CoreJava 笔记总结-第四章 对象与类

    文章目录 第四章 对象与类 使用预定义类 对象与对象变量 Java库中的LocalDate类 更改器方法和访问器方法 ==用户自定义类== 用`var`声明局部变量 使用`null`引用 隐式参数与显 ...

  9. 设计美学 第三章 设计美的文化差异

    文章目录 1 设计的文化语境 1.1分类 1.2文化语境举例 2 物我观差异下的设计美 2.1物我观定义 2.1东方人的物我观.造物观 2.2西方人的物我观.造物观 3 物用观差异下的设计美 3.1物 ...

最新文章

  1. 华为云微服务引擎CSE大量新特性上线,诚邀您免费体验
  2. c# xml html标签,在asp.net(C#)中采用自定义标签和XML、XSL显示数据
  3. cve-2019-11076 Cribl UI 1.5.0 未授权命令执行漏洞分析
  4. 十九、约束作用及常见约束
  5. 一文弄懂EnumMap和EnumSet
  6. [蓝桥杯][算法提高VIP]学霸的迷宫(bfs+dfs)
  7. 删除git中缓存的用户名和密码
  8. odp.net连接oracle9i 出错解决_交换机常见故障及解决方法
  9. android 仿qq it蓝豹,十大Android开源项目-IT蓝豹
  10. IO操作write()写的文档内不是你设置的buff
  11. php未来发展前景如何
  12. 理解Vulkan中的各种对象
  13. Perl 中关于 LWP::UserAgent等模块用法
  14. 银行都是用什么技术做超级App
  15. Tomcat配置HTTP协议转HTTPS协议
  16. 任正非回忆华为港湾“战争与和平”
  17. 国脚冯潇霆被广州恒大下放预备队
  18. 疯狂Java讲义(七)----第二部分
  19. 学Java有必要考研吗-Java开发要不要读研
  20. 因果系列文章(7)——干预工具(下)

热门文章

  1. 类模板里面的函数写在类模板里面和写在类模板的外面,且在1个.cpp文件中
  2. MT2503的SDK到底有几个版本
  3. 存储交换机和普通交换机
  4. Elasticsearch(ES)数据库模糊查询source下的数据
  5. 电子琴的源程序(eda课程设计)
  6. 期货反跟单-盘手交易规则分享
  7. PopWindow踩坑
  8. 微信小程序内嵌webview实现微信登录
  9. Uni-app + uview 个人信息页 上传、剪裁头像至服务器
  10. HTML第二章 “表格”详解 (附带详细代码与解释)!!!