• DP动态规划1


    什么是动态规划

    动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。

     动态规划4要素

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

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

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

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

     例题  最大子段和

    题目描述

    给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。

    输入格式

    第一行是一个整数,表示序列的长度 n。

    第二行有 n 个整数,第 ii 个整数表示序列的第 i 个数字 ai​。

    输出格式

    输出一行一个整数。

    输入样例:

    1. 7
    2. 2 -4 3 -1 2 -4 3

    输出样例:

    4

     第一步,确认状态

    1. int n,arr[n];//定义一个正整数n,和一个存放数据的数组arr
    2. int t[n];//定义一个数组t他的作用是存放一段又一段的最大子段和

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

    arr:2  -4  3  -1  2  -4  3

    t:0  0  0  0  0  0  0

    arr数组第一个数2和0比2大所以t[0]=2

    arr:2  -4  3  -1  2  -4  3

    t:2  0  0  0  0  0  0

    arr数组第2个数-4加上2比-4大所以t[1]=2+-4

    arr:2  -4  3  -1  2  -4  3

    t:2  -2  0  0  0  0  0

    arr数组第3个数3加上-2比3小所以t[2]=3

    arr:2  -4  3  -1  2  -4  3

    t:2  -2  3  0  0  0  0

    arr数组第4个数-1加上3比-1大所以t[3]=2

    arr:2  -4  3  -1  2  -4  3

    t:2  -2  3  2  0  0  0

    arr数组第5个数2加上2比2大所以t[4]=4

    arr:2  -4  3  -1  2  -4  3

    t:2  -2  3  2  4  0  0

    arr数组第6个数-4加上4比-4大所以t[5]=0

    arr:2  -4  3  -1  2  -4  3

    t:2  -2  3  2  4  0  0

    arr数组第7个数3加上0比3相等所以t[6]=3

    arr:2  -4  3  -1  2  -4  3

    t:2  -2  3  2  4  0  3

    而t数组最大的是4

    所以最大子段和是4

    状态转移方程为f[i]=max(f[i-1]+arr[i],arr[i]);//重点

    第三步,确定边界

    没有转移不到的地方

     第四步,确定填表顺序

    从前往后

    代码

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

    结果

     谢谢观看

  • 相关阅读:
    Dubbo中@EnableDubbo注解原理
    银行利率bp是什么意思,利率bp怎么换算
    python调用飞书机器人发送文件
    2022.11.12 英语背诵
    django小区居民出入申报系统Vue+flask疫情防控社区疫苗预约系统python
    用java实现 s=a+aa+aaa+aaaa+aa...a 的值,a是用户任意输入的数字,n为最后一个累加的数的位数(累加数的个数)
    Java编程练习题Demo61-Demo70
    Redis解决缓存穿透,缓存雪崩,缓存击穿思路
    DDD - 来自听众的16个DDD问题,美团技术团队是这样回答的
    【C#】【SAP2000】OAPI文档案例详解
  • 原文地址:https://blog.csdn.net/setprecisiona/article/details/127701105