『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)
本文索引目录:
一、动态规划的基本思想
二、单调递增最长子序列、租用游艇问题(PTA)递归方程
三、一道区间动态规划题点拨升华动态规划思想
四、结对编程情况
一、动态规划的基本思想:
1.1 基本概念:
动态规划算法简单说,利用拆解问题思想,定义问题状态和状态之间的关系,使得问题能够以递推或者是分治的方式去解决。
动态规划算法的基本思想与分治法很相似,将待求解的问题分解为若干个子问题,前一子问题的解,为后一子问题的求解所依赖。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
1.2 使用条件:
(1)具有最优子结构。
具有最优子结构也可能是适合用贪心的方法求解。
注意要确保我们考察了最优解中用到的所有子问题。
1、证明问题最优解的第一个组成部分是做出一个选择;
2、对于一个给定问题,在其可能的第一步选择中,你界定已经知道哪种选择才会得到最优解。你现在并不关心这种选择具体是如何得到的,只是假定已经知道了这种选择;
3、给定可获得的最优解的选择后,确定这次选择会产生哪些子问题,以及如何最好地刻画子问题空间;
4、证明作为构成原问题最优解的组成部分,每个子问题的解就是它本身的最优解。方法是反证法,考虑加入某个子问题的解不是其自身的最优解,那么就可以从原问题的解中用该子问题的最优解替换掉当前的非最优解,从而得到原问题的一个更优的解,从而与原问题最优解的假设矛盾。
要保持子问题空间尽量简单,只在必要时扩展。 最优子结构的不同体现在两个方面: 原问题的最优解中涉及多少个子问题; 确定最优解使用哪些子问题时,需要考察多少种选择。 子问题图中每个定点对应一个子问题,而需要考察的选择对应关联至子问题顶点的边。
(2)子问题重叠。
子问题空间要足够小,即问题的递归算法会反复地求解相同的子问题,而不是一直生成新的子问题。
1.3 使用思想:
(1)首先是拆分问题,将问题划分成一步一步这样就可以通过递推或者递归来实现。
(2)其次定义问题状态和状态之间的关系,前面拆分的步骤之间的关系,用一种量化的形式表现出来,也即状态转移方程式。
1.4 动态规划的问题种类:
(1)背包动态规划问题
(2)区间动态规划问题
(3)有向无环图的动态规划问题
(4)树形动态规划问题
(5)状态压缩动态规划问题
(6)数位动态规划问题
(7)插头动态规划问题
(8)计数动态规划问题
(9)实时动态规划问题
(10)动态规划优化问题等
二、单调递增最长子序列、租用游艇问题(PTA)递归方程:
单调递增最长子序列:dp[ i ] 表示当前以a[i]结束时之前的递增子序列的最大长度。
/* 动规转移方程: dp[ i ] = max(1,dp[ j ] + 1) 【满足aj<ai且j<i】;*/
租用游艇问题:dp[ i ] 表示到i站时的最小租金
/* 动规转移方程:dp[ i ] = min(dp[ i ],dp[ j ] + temp[ j ][ i ]);【满足j<i】*/
三、一道区间动态规划题点拨升华动态规划思想:
2.1 题目来源:
Vjudge:https://vjudge.net/contest/112701#problem/G
2.2 题目题干:
You Are the One
2.3 题目大意:
题目意思是:给定一个有序队伍,在进入舞台前,需要先进入一个狭小的黑屋子,最先进去的人最后出来,进入舞台的顺序会影响到每个人的愤怒值,每个人上台的时候的愤怒值为第k个人上场乘以自己的屌丝值,试问怎么安排人员进出狭小黑屋子能实现最小化愤怒值?
这个问题简化来说,就是给定一个有序队列,进入一个栈中(也即题目的狭小黑屋子),然后通过不断地进栈出栈实现人员顺序调整,最后使得上台之后的所有人愤怒值总和最小。
2.4 题目思路:
首先介绍一下区间DP:
定义:区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。
核心思路:既然让我求解在一个区间上的最优解,那么我把这个区间分割成一个个小区间,求解每个小区间的最优解,再合并小区间得到大区间即可。所以在代码实现上,我可以枚举区间长度len为每次分割成的小区间长度(由短到长不断合并),内层枚举该长度下可以的起点,自然终点也就明了了。然后在这个起点终点之间枚举分割点,求解这段小区间在某个分割点下的最优解。
基本模板:
for(int len = 1;len<=n;len++){//枚举长度
for(int j = 1;j+len<=n+1;j++){//枚举起点,ends<=n
int ends = j+len - 1;
for(int i = j;i<ends;i++){//枚举分割点,更新小区间最优解
dp[j][ends] = min(dp[j][ends],dp[j][i]+dp[i+1][ends]+something);
}
}
}
本题思路:
题意给出n个人,每个人都有他们自己的屌丝值,第k个人出场的愤怒值为(k-1)*屌丝值,现在有一个栈,可以通过栈的入栈出栈操作来实现调整队伍的方法,可以很明显的了解到这能够使用区间DP,也即把一个大的区间去转化成两个小区间,思想有点类似于分治法,对于一个人,如果他是第k个出场的,那么一定是i到i+k-1中以一种方式出场,然后这个人出场,然后i+k到j以一种方式出场,这样就分成了三个区间,[i,i]、[i+1,i+k-1]、[i+k,j]这三个区间。
2.5 题目AC代码:
#include<bits/stdc++.h>
using namespace std; int times;
int dp[][];
int main()
{
ios::sync_with_stdio(false);
cin>>times;
for(int i = ;i<=times;i++)
{
int temp;
cin>>temp;
int *mark = new int[temp+];
int *ans = new int[temp+];
ans[] = ; for(int i = ;i<=temp;i++)
{
ans[i] = ;
cin>>mark[i];
ans[i] = ans[i-] + mark[i];
} for(int i=;i<;i++)
{
for(int j=i+;j<;j++)
dp[i][j]=;
} for(int d=; d<=temp; d++) {
for(int i=, j=d; j<=temp; i++, j++) {
for(int k=; k<=j-i+; k++) {
dp[i][j] = min(dp[i][j], dp[i+][i+k-]+dp[i+k][j]+(ans[j]-ans[i+k-])*k+mark[i]*(k-));
}
}
} cout<<"Case #"<<i<<": "<<dp[][temp]<<endl;
}
}
四、 结对编程情况:
经过第一次实践合作之后,第二次的实践合作更加顺利流畅,能够让双方都能在相同思路上齐头并进,当和三木小哥哥想到一起完成了算法设计、完成代码书写、成功AC一题之后,一种喜悦感涌上心头,虽然第三题有一小点WA了,不过还是很合作默契的哈哈,感谢三木小哥哥一直包容我的错误哈哈哈哈。
相信在下一次结对编程会愈发顺利,加油。
如有不合理的地方,请及时指正,我愿听取改正~
参考链接:https://oi-wiki.org/
『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)的更多相关文章
- 『嗨威说』算法设计与分析 - 贪心算法思想小结(HDU 2088 Box of Bricks)
本文索引目录: 一.贪心算法的基本思想以及个人理解 二.汽车加油问题的贪心选择性质 三.一道贪心算法题点拨升华贪心思想 四.结对编程情况 一.贪心算法的基本思想以及个人理解: 1.1 基本概念: 首先 ...
- 『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)
本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 ...
- 『嗨威说』算法设计与分析 - STL中Sort函数的实现原理初探
本文索引目录: 一.对Sort算法实现的个人阅读体会 二.Sort算法使用的三个排序算法的优点介绍 2.1 插入排序的优缺点 2.2 堆排序的优缺点 2.3 快速排序的优缺点 2.4 新的结合排序—— ...
- 『嗨威说』算法设计与分析 - PTA 程序存储问题 / 删数问题 / 最优合并问题(第四章上机实践报告)
本文索引目录: 一.PTA实验报告题1 : 程序存储问题 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 删数问题 2.1 实践题目 ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- 『嗨威说』常见的C++函数模板整理(一)
开学两天,身上的职责直接变为两个班班长,三个小组组长,哇这事情估计够我忙活了,想躲都躲不掉啊,看来我还是真招人推荐各种管理职务啊,以后要是有人推荐我当经理啊领导啊该多好哈哈哈哈.记得今天奶奶生日,很开 ...
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划
由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...
- 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)
PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...
- 算法设计与分析 - AC 题目 - 第 2 弹
PTA-算法设计与分析-AC原题7-1 最大子列和问题 (20分)给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 ...
随机推荐
- [VB.NET Tips]赋值运算千万要注意
赋值运算符是一个语句,不能在表达式中使用,表达式中的等号表示相等而不是赋值. 上示例: Dim x As Integer Dim y As Object x = 5 y = x = 5 Console ...
- odoo Botton标签属性详解
按钮属性 1)icon 按钮图标名,可用的按钮图标在 addons/web/static/src/img/下. 2)string 按钮的显示文字 3)type 动作执行类型.可能值是:workflow ...
- 基于vue实现搜索高亮关键字
有一个需求是在已有列表中搜索关键词,然后在列表中展示含有相关关键字的数据项并且对关键字进行高亮显示,所以该需求需要解决的就两个问题: 1.搜索关键词过滤列表数据 2.每个列表高亮关键字 ps: 此问题 ...
- BCD 码、Gray 码、ASCII 码都是什么呢?
BCD 码:即(Binary Coded Decimal)码,也称为 8421 码,是十进制代码中最常见的一种.每一位的 1 代表的十进制数称为这一位的权.BCD 码中每一位的权都是固定不变的,它属于 ...
- 用 CocosCreator 快速开发推箱子游戏
游戏总共分为4个功能模块: - 开始游戏(menuLayer) - 关卡选择(levelLayer) - 游戏(gameLayer) - 游戏结算(gameOverLayer) Creator内组件效 ...
- 【Python笔记】Python 基础语法
Python 标识符 在 Python 里,标识符由字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大小 ...
- hadoop之mapreduce详解(进阶篇)
上篇文章hadoop之mapreduce详解(基础篇)我们了解了mapreduce的执行过程和shuffle过程,本篇文章主要从mapreduce的组件和输入输出方面进行阐述. 一.mapreduce ...
- Win系统下使用命令链接MySQL数据库
方法一: 1:打开[开始]>[运行]输入[cmd]单击[确定]后出现CMD命令黑色窗口,这就是我们说的CMD命令行 2:默认进入C盘,于是我们可以进入E盘,点击回车.因为我的数据库是存放在E盘的 ...
- Maven 梳理 -目录结构
Maven项目的目录约定 MavenProjectRoot(项目根目录) |----src | |----main | | |----java ——存放项目的.java文件 | | |----reso ...
- UML图标含义及记忆方法
记忆技巧: 箭头的一方为被动方(被调用者): 箭头的端点为主动方(调用者). 箭头为封闭三角形时,表示类间关系 箭头为半封闭尖括号时,表示类内关系.其中,虚线表示参数强制依赖关系,实线表示属性关系.一 ...