动态规划入门

动态规划入门

 

动态规划 是编程解题的一种重要手段。1951 年美国数学家 R.Bellman 等人,根据一类多阶段问题的特点,把多
阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。与此同时,他提出了解决这类问题的“最
优化原理”,从而创建了解决最优化问题的一种新方法:动态规划
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于
一个值,我们希望找到具有最优值的解。

我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结
果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。
动态规划的基本概念:

阶段:把所给问题的求解过程恰当地分成若干个相互联系的阶段,以便于求解。过程不同,阶段数就可能不
同。描述阶段的变量称为阶段变量,常用 k 表示。阶段的划分,一般是根据时间和空间的自然特征来划分,
但要便于把问题的过程转化为多阶段决策的过程。
状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因
素。通常一个阶段有若干个状态,状态通常可以用一个或一组数来描述,称为状态变量。
决策:表示当过程处于某一阶段的某个状态时,可以做出不同的决定,从而确定下一阶段的状态,这种决定
称为决策。不同的决策对应着不同的数值,描述决策的变量称决策变量。
状态转移方程:动态规划中本阶段的状态往往是上一阶段的状态和上一阶段的决策的结果,由第 i 段的状态 
  f(i) ,和决策 u(i) 来确定第 i + 1 段的状态。状态转移表示为 F(i + 1) = T(f(i), u(i)),称为状态转移方程。
策略:各个阶段决策确定后,整个问题的决策序列就构成了一个策略,对每个实际问题,可供选择的策略有
一定范围,称为允许策略集合。允许策略集合中达到最优效果的策略称为最优策略。

下面来一道例题:

 

数塔问题

 

Description

观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。

 

在上面的样例中,从13到8到26到15到24的路径产生了最大的和86。

 

Input

 

第一个行包含R(1≤ R≤1000),表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

所有的被供应的整数是非负的且不大于100。

Output

 

单独的一行,包含那个可能得到的最大的和。

 

Sample Input 1 

5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11

 Sample Output 1

 

86

 

分析这道题可以从上一个问题,推断下一个问题。那么就可以选择从第一开始搜也就是这个样例当中的第一行第一个“13”开始,那么它下一行 i 的也就可以从 i - 1 的第 j 个和第 j - 1 找到第 i , j 个的最大值那么转移方程就可以得到 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + a[i][j]; 那么此时的dp[n][1 ~ n] 中的最大值就是此题的解;

参考代码:

#include <bits/stdc++.h>
using namespace std;

int r;
int a[1001][1001];
int dp[1001][1001];

int main() {
	cin >> r;
	for(int i = 1; i <= r; i++) {
		for(int j = 1; j <= i; j++) {
			cin >> a[i][j];
		}
	}
	for(int i = 1; i <= r; i++) {
		for(int j = 1; j <= i; j++) {
			dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + a[i][j];//从j - 1 和 j 来解决问题
		}
	}
	int max1 = -999;//设置最大值 
	for(int i = 1; i <= r; i++){
		if(dp[r][i] > max1){
			max1 = dp[r][i];//寻找最大的那一个 
		}
	}
	cout << max1 << endl;
	return 0;
}

 那么现在这个题也解决了;

点击

哈哈

标题基于SpringBoot+Vue的社区便民服务平台研究AI更换标题第1章引言介绍社区便民服务平台的研究背景、意义,以及基于SpringBoot+Vue技术的研究现状和创新点。1.1研究背景与意义分析社区便民服务的重要性,以及SpringBoot+Vue技术在平台建设中的优势。1.2国内外研究现状概述国内外在社区便民服务平台方面的发展现状。1.3研究方法与创新点阐述本文采用的研究方法和在SpringBoot+Vue技术应用上的创新之处。第2章相关理论介绍SpringBoot和Vue的相关理论基础,以及它们在社区便民服务平台中的应用。2.1SpringBoot技术概述解释SpringBoot的基本概念、特点及其在便民服务平台中的应用价值。2.2Vue技术概述阐述Vue的核心思想、技术特性及其在前端界面开发中的优势。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue如何有效整合,以提升社区便民服务平台的性能。第3章平台需求分析与设计分析社区便民服务平台的需求,并基于SpringBoot+Vue技术进行平台设计。3.1需求分析明确平台需满足的功能需求和性能需求。3.2架构设计设计平台的整体架构,包括前后端分离、模块化设计等思想。3.3数据库设计根据平台需求设计合理的数据库结构,包括数据表、字段等。第4章平台实现与关键技术详细阐述基于SpringBoot+Vue的社区便民服务平台的实现过程及关键技术。4.1后端服务实现使用SpringBoot实现后端服务,包括用户管理、服务管理等核心功能。4.2前端界面实现采用Vue技术实现前端界面,提供友好的用户交互体验。4.3前后端交互技术探讨前后端数据交互的方式,如RESTful API、WebSocket等。第5章平台测试与优化对实现的社区便民服务平台进行全面测试,并针对问题进行优化。5.1测试环境与工具介绍测试
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值