【Hello Algorithm】 暴力递归到动态规划 -- 总结

简介: 【Hello Algorithm】 暴力递归到动态规划 -- 总结

动态规划总结

什么样的问题可以动态规划

我们发现过程中有重复调用的问题 我们可以使用动态规划

暴力递归和动态规划的关系

如果一个暴力递归问题 有重复调用的过程 我们就可以把它优化成动态规划

所有的动态规划问题一定可以转化成暴力递归

但是并不是所有的暴力递归都可以转化城动态规划

如何找到某个问题的动态规划方式

  1. 设计暴力递归
  2. 分析有没有重复解
  3. 实现记忆化搜索
  4. 改写动态规划

暴力递归的设计原则

一般来说 我们有几个可变参数 我们就有一张几维表

  1. 我们要设计的可变参数类型一定不要超过整形 如果我们设计的一个可变参数是数组 要改成动态规划是十分困难的
  2. 如果我们违反了原则1 可变参数类型突破到了一维线性结构 那么我们接下来就只能使用一个可变参数 并且要使用记忆化搜索的方式来进行动态规划
  3. 可变参数的个数 能省则省

暴力递归尝试的四种模型

  • 从左往右尝试模型
  • 范围方式模型
  • 样本对应模型
  • 业务限制模型

N皇后问题

本题是leetcode原题

题目连接: N皇后问题

题目描述

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案个数.

我们解决n皇后问题的思路如下

我们选择每一行都放一个棋子 这样子我们就能保证最基本的行不冲突 之后我们后面的棋子只需要保证不同列不同斜线就可以

那么现在的问题就变成了我们如何保证不同列不同斜线呢?

我们这里可以选择使用一个数组来记录每一行的列数 之后使用公式判断即可(同斜线公式 行相减的绝对值 = 列相减的绝对值 )

代码表示如下

bool IS_VAILD(vector<int>& cord , int i , int j)
{
  for (int k = 0 ; k < i ; k++)    
  {    
    if (j == cord[k] || abs(cord[k] - j) == abs(i - k))
    {    
      return false;    
    }                                                                                                                                                    
  }    
  return true;    
}    
// 0 ~ n-1    
int process(int i , vector<int>& cord , int n)    
{    
  if (i == n)    
  {    
    return 1;    
  }    
  int ans = 0;    
  for (int j = 0; j < n; j++)    
  {    
    if (IS_VAILD(cord , i , j))    
    {    
      cord[i] = j;    
      ans += process(i+1 , cord , n);    
    }    
  }    
  return ans;
}

这就是一个我们可以写递归但是写不了动态规划的题目

相关文章
|
10月前
|
消息中间件 人工智能 自然语言处理
基于事件驱动构建 AI 原生应用
AI 应用在商业化服务的阶段会面临诸多挑战,比如更快的服务交付速度,更实时、精准的结果以及更人性化的体验等,传统架构限制于同步交互,无法满足上述需求,本篇文章给大家分享一下如何基于事件驱动架构应对上述挑战。
653 243
|
存储 SQL 缓存
分库分表之ShardingSphere(一)
分库分表之ShardingSphere
|
JavaScript 关系型数据库 MySQL
MySQL5.7中不能输入中文怎么解决?
MySQL5.7中不能输入中文怎么解决?
426 0
MySQL5.7中不能输入中文怎么解决?
|
SQL 开发工具 git
Git:Git中的远程操作和标签管理--分布式版本控制系统
Git:Git中的远程操作和标签管理--分布式版本控制系统
|
Windows
[UE虚幻引擎] DTCopyFile 插件说明 - 使用蓝图拷贝复制文件 (Windows)
本插件可以在虚幻引擎中使用蓝图对系统的其他文件进行拷贝复制操作。
204 0
|
供应链 JavaScript 数据管理
ERP业财一体化成为企业管理新趋势
无论是大企业,还是小企业,都有大大小小的部门,以负责企业的各种事务,各部门对其传输的基本资料和业务负有责任。然而,由于某些企业的经营观念和管理制度不完善,部分工作无法顺利开展。因此企业逐渐开始重视业财一体化ERP系统的应用。
236 0
|
存储 人工智能 编解码
以萨技术携手昇腾AI,把握数字城市建设的“智慧灵魂”
以萨技术携手昇腾AI,把握数字城市建设的“智慧灵魂”
|
编解码 Android开发 开发者
Android音视频——系统播放器介绍(二)
Android音视频——系统播放器介绍(二)
216 0
Android音视频——系统播放器介绍(二)
|
索引 自然语言处理 搜索推荐
[ElasticSearch]精确值与全文文本
Elasticsearch中的数据可以大致分为两种类型:精确值和全文文本。 1. 精确值(Exact values) 精确值是精确的,正如它的名字一样。
1278 0