动态规划

动态规划是一种用于解决最优化问题的算法,通过记录子问题的最优解来求解全局最优。本文介绍了动态规划的基本步骤,并通过最大连续子序列和、最长上升子序列和最长公共子序列这三个经典问题的解析及代码实现,帮助读者深入理解动态规划的思路和应用。
摘要由CSDN通过智能技术生成

动态规划是一种用来解决最优化问题的算法思想,其会记录下子问题的最优解,综合子问题的最优解得到最优解。
上面有两个关键,划分子问题和记录子问题,其中划分子问题有一个重要的状态转移方程。
一般解决步骤如下:
1.确定维数,确定dp数组。
2.每一维采用下面表述,为i或者前i。
3.之后问题可以描述为dp[i]为恰好为i(或者前i)的XXX(问题描述),然后思考dp[i-1]得出状态转移方程。

动态规划的题目主要可能得多看习题领悟,这里针对典型例题来领悟动态规划的过程。
最大连续子序列和
问题:给定一个序列(整数或浮点数),求出其中连续的子序列和最大的那一个。
例:序列{-10 1 2 3 4 -5 -23 3 7 -21},其最大的连续子序列为{1 2 3 4}或{3 7},最大和为10。

首先涉及到一个序列,应该是一维问题,应该可以用一个一维数组来记录子问题的最优解,第二步dp[i]表述恰好为i时在最大连续和(前i肯定不合适),第三步思考dp[i-1]和dp[i] 的关系,如果dp[i-1]<0,显然dp[i]=a[i],否则加上前面的dp[i-1]dp[i]肯定更大,于是状态转移方程得出。最后问题思考的序列完找出dp[i]最大的即可。

附代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10001;
int dp[maxn],a[maxn];//dp[i] 表示结尾恰好为i时最大和 


int main(){
   
	int n;
	while(scanf("%d",&n),n){
   
		fill(dp,dp+n+1,-1);
		for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
		int max=-100000,k=-1;
		
		for(int i=1;i<=n;i++)
		{
   
			if(dp[i-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值