使用的图片
代码:
\documentclass{beamer}
\usepackage[UTF8, scheme = plain]{ctex}
\usetheme{Warsaw}
%\usecolortheme{beaver}
\usepackage{graphicx}
\usepackage{listings}
\lstset{language = C++, numberstyle=\tiny,keywordstyle=\color{blue!70},commentstyle=\color{red!50!green!50!blue!50},rulesepcolor=\color{red!20!green!20!blue!20},basicstyle=\ttfamily\small}
\title{动态规划}
\author{陶鸿杰}
\institute{QQ:1170755856}
\date{2019/05/05}
%-------------------------------------------------------------------------------------------------
\begin{document}
%---------------------------section A-----------------------------------------
\section{简单的问题}
\subsection{介绍}
\frame{\titlepage}
%---------------------------------------------
\subsection{数字三角形}
\begin{frame}
\frametitle{\href{http://poj.org/problem?id=1163}{数字三角形(POJ1163)}}
%------------左右分栏------
\begin{minipage}[b]{0.30\linewidth}
\includegraphics[scale=0.5]{pic/NumTriangle.jpg}
\end{minipage}
\hfill
\begin{minipage}[b]{0.55\linewidth}
在左侧的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。\\
\begin{itemize}
\item 路径上的每一步都只能往左下或 右下走。
\item 只需要求出这个最大和即可,不必给出具体路径。
\item 三角形的行数大于1,小于等于100,数字为 0 - 99。
\end{itemize}
\end{minipage}
\end{frame}
\begin{frame}[fragile]
\frametitle{问题分析:}
%------------左右分栏------
\begin{minipage}[b]{0.30\linewidth}
\includegraphics[scale=0.5]{pic/NumTriangle.jpg}
\end{minipage}
\hfill
\begin{minipage}[b]{0.55\linewidth}
\begin{itemize}
\item 三角形的行数大于1,小于等于100,数字为 0 - 99。
\item 暴力的时间复杂度是 $O(2^n)$,而 $2^{100}$ 肯定会超时
\item 在不考虑记忆话搜索的情况下,我们需要怎么解决这个问题呢?
\end{itemize}
\end{minipage}
\end{frame}
\begin{frame}[fragile]
\frametitle{问题分析:}
%------------左右分栏------
\begin{minipage}[b]{0.30\linewidth}
\includegraphics[scale=0.5]{pic/NumTriangle.jpg}
\end{minipage}
\hfill
\begin{minipage}[b]{0.55\linewidth}
\iffalse
三角形的行数最大是100,暴力的时间复杂度是 $O(2^n)$,而 $2^{100}$ 肯定会超时\\
在不考虑记忆话搜索的情况下,我们需要怎么解决这个问题呢?\\
我们以a[i][j]表示这个数字三角形第i行j列上的数字
\fi
\begin{itemize}
\item 用a[i][j]存储这个数字三角形第i行的第j个数字
\item 当前的位置dp[i][j]看成一个状态
\item 则dp[i][j]的状态只能由它的上一层头顶上的那两个状态转移到的
\end{itemize}
\end{minipage}
\end{frame}
\begin{frame}[fragile]
\frametitle{问题分析:}
%------------左右分栏------
\begin{minipage}[b]{0.30\linewidth}
\includegraphics[scale=0.5]{pic/NumTriangle.jpg}
\end{minipage}
\hfill
\begin{minipage}[b]{0.55\linewidth}
\begin{itemize}
\item 我们已经知道对于任意一个位置,它的状态dp[i][j]是由它的上面两个状态转移过来的\\
\item 我们反过来想,如果我们让路径从下往上走,那么:对于任意一个位置,它的状态dp[i][j]是由它的下面两个状态转移过来的
\end{itemize}
\end{minipage}
\begin{block}{状态转移方程:}
$dp[i][j] = a[i][j] + max(dp[i+1][j], dp[i+1][j+1])$
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{我们可以写出代码了}
\begin{block}{核心代码 (复杂度为$O(n^2)$)}
\begin{lstlisting}
for(int i=n-1;i>0;i--)
for(int j=1;j<=i;j++)
a[i][j] += max(a[i+1][j],a[i+1][j+1]);
printf("%d\n",a[1][1]);
\end{lstlisting}
\end{block}
动态规划
\end{frame}
%--------------------------------动态规划解题的一般思路------------------------
\begin{frame}[fragile]
\frametitle{动态规划解题的一般思路}
\begin{minipage}[b]{0.30\linewidth}
\begin{figure}
\centering
\includegraphics[scale=0.40]{pic/NumTriangle.jpg}
\end{figure}
\end{minipage}
\hfill
\begin{minipage}[b]{0.65\linewidth}
\begin{block}{1.将原问题分解为子问题}
\begin{itemize}
\item 把原问题分解为若干个子问题,子问题和原问题形式相同或类似,只不过规模变小了。子问题都解决,原问题即解决。
\item 子问题的解一旦求出就会被保存,所以每个子问题只需求解一次。
\end{itemize}
\end{block}
\end{minipage}
\end{frame}
\begin{frame}[fragile]
\frametitle{动态规划解题的一般思路}
\begin{minipage}[b]{0.30\linewidth}
\begin{figure}
\centering
\includegraphics[scale=0.40]{pic/NumTriangle.jpg}
\end{figure}
\end{minipage}
\hfill
\begin{minipage}[b]{0.65\linewidth}
\begin{block}{2.确定状态}
\begin{itemize}
\item 动态规划解题时,我们往往将和子问题相关的各个变量的一组取值,称之为一个“状态”。
\item 一个“状态”对应于一个或多个子问题,某个“状态”下的“值”,就是这个“状态”所对应的子问题的解。
\end{itemize}
\end{block}
\end{minipage}
\end{frame}
\begin{frame}[fragile]
\frametitle{动态规划解题的一般思路}
\begin{minipage}[b]{0.30\linewidth}
\begin{figure}
\centering
\includegraphics[scale=0.40]{pic/NumTriangle.jpg}
\end{figure}
\end{minipage}
\hfill
\begin{minipage}[b]{0.65\linewidth}
\begin{block}{3.确定一些初始状态(边界状态)的值}
\begin{itemize}
\item 就以“数字三角形”为例,初始状态就是底边数字,值就是底边数字值。
\end{itemize}
\end{block}
\end{minipage}
\end{frame}
\begin{frame}[fragile]
\frametitle{动态规划解题的一般思路}
\begin{minipage}[b]{0.30\linewidth}
\begin{figure}
\centering
\includegraphics[scale=0.40]{pic/NumTriangle.jpg}
\end{figure}
\end{minipage}
\hfill
\begin{minipage}[b]{0.65\linewidth}
\begin{block}{4.确定状态转移方程}
\begin{itemize}
\item 定义出什么是“状态”,以及在该“状态”下的“值”后,就要找出不同的状态之间如何迁移——即如何从一个或多个“值”已知的“状态”,求出另一个“状态”的“值”(“人人为我’递推型)。状态的迁移可以用递推公式表示,此递推公式也可被称作“状态转移方程”。
\end{itemize}
\end{block}
\end{minipage}
\end{frame}
\begin{frame}[fragile]
\frametitle{能用动规解决的问题的特点}
\begin{block}{问题具有最优子结构的性质}
\begin{itemize}
\item 如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质
\end{itemize}
\end{block}
\begin{block}{无后效性}
\begin{itemize}
\item 当前的若干个状态值一旦确定,则