什么是动态规划?
动态规划(英语: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;
}
结果
谢谢观看