• DP动态规划2


    动态规划4要素

    1.确认状态:求什么定义什么。

     2.动规状态转移方程:缩小规模,但本质没有改变,问题求什么,子问题求什么。//重点

     3.确定边界:不能被状态转移方程所计算出来的状态就是边界。

     4.确定填表顺序:从左到右或从上往下。

     例题 最大路经和

    题目描述

    给定m行n列的网格。求一个从左上角(0,0)到右下角的路径,每一步只能向下或者向右走一步,求有多少种路径。

    输入格式

    第一行是两个整数,表示网格的长度和宽度,m,n。

    输出格式

    输出一行一个整数。

    输入样例:

    2 3

    输出样例:

    3

    第一步,确认状态

    int m,n,f[M][N];

    第二步,状态转移方程//重点//仔细看

    a为i-1,b为j-1,1为填充物

    f数组:为

    1  1  1  1  1

    1  1  1  1  1

    1  1  1  1  1

    1  1  1  1  b

    1  1  1  a  终点

    所以a+b的和为最大路经和

    方程为:f[i][j]=f[i-1][j]+f[i][j-1]

     第三步,确定边界

     因为不能被状态转移方程所计算出来的状态就是边界

    而这道题有边界

    1为填充物,2为边界

    2  2  2  2  2

    2  1  1  1  1

    2  1  1  1  1

    2  1  1  1  1

    2  1  1  1  终点

    为啥他不能被转换呢?

    因为到2的时候i-1就到负数了|

    所以要把他设为1要两个for   V

    1. for(int i=0;i
    2. f[0][i]=1;
    3. }
    4. for(int i=0;i
    5. f[i][0]=1;
    6. }

    第四步,确定填表顺序

    从前往后

    代码

    1. #include
    2. #define M 101
    3. #define N 101
    4. using namespace std;
    5. int m,n,f[M][N];
    6. int main()
    7. {
    8. cin>>m>>n;
    9. for(int i=0;i
    10. f[0][i]=1;
    11. }
    12. for(int i=0;i
    13. f[i][0]=1;
    14. }
    15. for(int i=1;i
    16. for(int j=1;j
    17. f[i][j]=f[i-1][j]+f[i][j-1];
    18. }
    19. }
    20. cout<-1][n-1];
    21. return 0;
    22. }

    结果

     谢谢观看

  • 相关阅读:
    Guava中的使用
    Python:PDF转长图像和分页图像
    我们简单的new了一个对象,JVM都做了哪些贡献?
    高校会议管理系统毕业设计
    一款超好用的开源密码管理器?
    代码随想录二刷day35
    模块与包——
    重磅!TikTok Shop将以新方式重启印尼业务
    第三节:运算符【java】
    Kafka安装与配置
  • 原文地址:https://blog.csdn.net/setprecisiona/article/details/127705804