我是靠谱客的博主 虚幻小丸子,最近开发中收集的这篇文章主要介绍动态规划算法思想的应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

由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. 根据计算最优值时得到的信息,构造最优解。

最后

以上就是虚幻小丸子为你收集整理的动态规划算法思想的应用的全部内容,希望文章能够帮你解决动态规划算法思想的应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部