DP动态规划1

什么是动态规划

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

 动态规划4要素

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

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

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

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

 例题  最大子段和

题目描述

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

输入格式

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

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

输出格式

输出一行一个整数。

输入样例:

7
2 -4 3 -1 2 -4 3

输出样例:

4

 第一步,确认状态

int n,arr[n];//定义一个正整数n,和一个存放数据的数组arr
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]);//重点

第三步,确定边界

没有转移不到的地方

 第四步,确定填表顺序

从前往后

代码

#include <iostream>
#include <algorithm>
#define N 1000

using namespace std;

int n,arr[N],f[N],x;
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    f[0]=arr[0];
    for(int i=1;i<=n;i++){
        f[i]=max(f[i-1]+arr[i],arr[i]);
    }
    for(int i=0;i<n;i++){
        if(x<f[i])
        x=f[i];
    }
    cout<<x;
}

结果

 谢谢观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值