动态规划算法思想的应用

本关任务:掌握动态规划算法思想,并能利用动态规划算法思想解决最长非降子序列(非连续)问题:

由n个正整数组成的序列,从该序列中删除若干个整数,使得剩下的整数组成单调非降子序列,求最长的单调非降子序列并输出(测试数据保证有唯一解)。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 101;

int main(int argc, const char * argv[]) {
    
    // 请在这里补充代码,完成本关任务
    /********* Begin *********/
    int n;
    int arr[maxn];
    int dp[maxn];
    int id[maxn];
    int maxl, maxid;
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        scanf("%d", &arr[i]);
    }
    memset(dp, 0, sizeof(dp));
    maxl = 1;
    maxid = n-1;
    dp[n-1] = 1;
    id[n-1] = n-1;
    for (int i=n-2; i>=0; i--) {
        dp[i] = 1;
        id[i] = i;
        for (int j=i+1; j<n; j++) {
            if (arr[i]<=arr[j] && dp[i]<=dp[j]+1) {
                dp[i] = dp[j]+1;
                id[i] = j;
            }
        }
        if (maxl < dp[i]) {
            maxl = dp[i];
            maxid = i;
        }
    }
    printf("%d", arr[maxid]);
    maxid = id[maxid];
    maxl--;
    while (maxl--) {
        printf(" %d", arr[maxid]);
        maxid = id[maxid];
    }
    printf("\n");
 
    /********* End *********/
    
    return 0;
}

动态规划的基本概念

动态规划(Dynamic Programming)是求解分阶段决策过程最优化问题的数学方法。动态规划算法处理的对象是多阶段决策问题的最优值。

多阶段决策问题是指这样的一类特殊的活动过程: 问题可以分解成若干相互联系的阶段,在每一个阶段都要做出决策,形成一个决策序列,该决策序列也称为一个策略。对于每一个决策序列,可以在满足问题的约束条件下用一个数值函数(即目标函数)的值来衡量该策略的优劣。多阶段决策问题的最优化目标是获取导致问题最优值的最优决策序列(最优策略),即得到最优解。

动态规划的基本步骤

根据动态规划的基本概念,可以得到动态规划的基本模型和执行步骤如下:

  1. 找出最优解的性质,并刻画其结构特征:满足最优子结构性质(原问题的最优解包含着其子问题的最优解)。

  2. 递归地定义最优值。

  3. 以自底向上的方式计算出最优值。

  4. 根据计算最优值时得到的信息,构造最优解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值