DP:0
小故事:
A * "1+1+1+1+1+1+1+1 =?" *
A : "上面等式的值是多少"
B : *计算* "8!"
A *在上面等式的左边写上 "1+" *
A : "此时等式的值为多少"
B : *quickly* "9!"
A : "你怎么这么快就知道答案了"
A : "只要在8的基础上加1就行了"
A : "所以你不用重新计算因为你记住了第一个等式的值为8!动态规划算法也可以说是 '记住求过的解来节省时间'"
---------------------
特性:
能采用动态规划求解的问题的一般要具有3个性质:
最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)
解题步骤:
1. 拆分问题
2. 定义状态(并找出初状态)
3. 状态转移方程
DP算法的两种形式:
上面已经知道动态规划算法的核心是记住已经求过的解,记住求解的方式有两种:①自顶向下的备忘录法 ②自底向上。
举一个最简单的例子:求斐波拉契数列Fibonacci 。
Fibonacci (n) = 1; n = 0
Fibonacci (n) = 1; n = 1
Fibonacci (n) = Fibonacci(n-1) + Fibonacci(n-2)
0.递归版本
public int fib(int n) { if(n<=0) return 0; if(n==1) return 1; return fib( n-1)+fib(n-2); }
递归树
很多节点(如fib(2))被执行。
1.自顶向下的备忘录法
public static int Fibonacci(int n)
{
if(n<=0)
return n;
int []Memo=new int[n+1];
for(int i=0;i<=n;i++)
Memo[i]=-1;
return fib(n, Memo);
}
public static int fib(int n,int []Memo)
{
if(Memo[n]!=-1)
return Memo[n];
//如果已经求出了fib(n)的值直接返回,否则将求出的值保存在Memo备忘录中。
if(n<=2)
Memo[n]=1;
else Memo[n]=fib( n-1,Memo)+fib(n-2,Memo);
return Memo[n];
}
理解:创建了一个n+1大小的数组来保存求出的斐波拉契数列中的每一个值,在递归的时候如果发现前面fib(n)的值计算出来了就不再计算,如果未计算出来,则计算出来后保存在Memo数组中,下次在调用fib(n)的时候就不会重新递归了。比如上面的递归树中在计算fib(6)的时候先计算fib(5),调用fib(5)算出了fib(4)后,fib(6)再调用fib(4)就不会在递归fib(4)的子树了,因为fib(4)的值已经保存在Memo[4]中。
2.自底向上
public static int fib(int n)
{
if(n<=0)
return n;
int []Memo=new int[n+1];
Memo[0]=0;
Memo[1]=1;
for(int i=2;i<=n;i++)
{
Memo[i]=Memo[i-1]+Memo[i-2];
}
return Memo[n];
}
自底向上方法也是利用数组保存了先计算的值,为后面的调用服务。观察参与循环的只有 i,i-1 , i-2三项,因此该方法的空间可以进一步的压缩如下。
public static int fib(int n)
{
if(n<=1)
return n;
int Memo_i_2=0;
int Memo_i_1=1;
int Memo_i=1;
for(int i=2;i<=n;i++)
{
Memo_i=Memo_i_2+Memo_i_1;
Memo_i_2=Memo_i_1;
Memo_i_1=Memo_i;
}
return Memo_i;
}
一般来说由于备忘录方式的动态规划方法使用了递归,递归的时候会产生额外的开销,使用自底向上的动态规划方法要比备忘录方法好。
Recursion Practice ★☆☆☆☆ 几个初级递推
Put Apple ★☆☆☆☆
Tri Tiling ★☆☆☆☆ 【例题1】
Computer Transformation ★☆☆☆☆ 【例题2】
Train Problem II ★☆☆☆☆
How Many Trees? ★☆☆☆☆
Buy the Ticket ★☆☆☆☆
Game of Connections ★☆☆☆☆
Count the Trees ★☆☆☆☆
Circle ★☆☆☆☆
Combinations, Once Again ★★☆☆☆
Closing Ceremony of Sunny Cup ★★☆☆☆
Rooted Trees Problem ★★☆☆☆
Water Treatment Plants ★★☆☆☆
One Person ★★☆☆☆
Relax! It’s just a game ★★☆☆☆
N Knight ★★★☆☆
Connected Graph ★★★★★ 楼天城“男人八题”之一
Function Run Fun ★☆☆☆☆ 【例题3】
FatMouse and Cheese ★☆☆☆☆ 经典迷宫问题
Cheapest Palindrome ★★☆☆☆
A Mini Locomotive ★★☆☆☆
Millenium Leapcow ★★☆☆☆
Brackets Sequence ★★★☆☆ 经典记忆化
Chessboard Cutting ★★★☆☆ 《算法艺术和信息学竞赛》例题
Number Cutting Game ★★★☆☆Constructing Roads In JG Kingdom ★★☆☆☆
Stock Exchange ★★☆☆☆
Wooden Sticks ★★☆☆☆
Bridging signals ★★☆☆☆
BUY LOW, BUY LOWER ★★☆☆☆ 要求需要输出方案数
Longest Ordered Subsequence ★★☆☆☆
Crossed Matchings ★★☆☆☆
Jack's struggle ★★★☆☆ 稍微做点转化
Max Sum ★☆☆☆☆ 最大子段和
Max Sum Plus Plus ★★☆☆☆ 最大M子段和
To The Max ★★☆☆☆ 最大子矩阵
Max Sequence ★★☆☆☆ 最大2子段和
Maximum sum ★★☆☆☆ 最大2子段和
最大连续子序列 ★★☆☆☆ 最大子段和
Largest Rectangle in a Histogram ★★☆☆☆ 最大子矩阵变形
City Game ★★☆☆☆ 最大子矩阵扩展
Matrix Swapping II ★★★☆☆ 最大子矩阵变形后扩展
Skiing ★☆☆☆☆
Super Jumping! Jumping! Jumping! ★☆☆☆☆
Milking Time ★★☆☆☆ 区间问题的线性模型
Computers ★★☆☆☆ 【例题5】
Bridge over a rough river ★★★☆☆ 【例题6】
Crossing River ★★★☆☆ 【例题6】大数据版
Blocks ★★★☆☆
Parallel Expectations ★★★★☆ 线性模型黑书案例
Palindrome ★☆☆☆☆ 【例题7】
See Palindrome Again ★★★☆☆
饭卡 ★☆☆☆☆ 01背包
I NEED A OFFER! ★☆☆☆☆ 概率转化
Bone Collector ★☆☆☆☆ 01背包
最大报销额 ★☆☆☆☆ 01背包
Duty Free Shop ★★☆☆☆ 01背包
Robberies ★★☆☆☆ 【例题8】
Piggy-Bank ★☆☆☆☆ 完全背包
Cash Machine ★☆☆☆☆ 多重背包
Coins ★★☆☆☆ 多重背包,楼天城“男人八题”之一
I love sneakers! ★★★☆☆ 背包变形
ChessboardProblem ★☆☆☆☆ 比较基础的状态压缩
Number of Locks ★☆☆☆☆ 简单状态压缩问题
Islands and Bridges ★★☆☆☆ 【例题9】
Tiling a Grid With Dominoes ★★☆☆☆ 骨牌铺方格 4XN的情况
Mondriaan's Dream ★★☆☆☆ 【例题10】的简易版
Renovation Problem ★★☆☆☆ 简单摆放问题
The Number of set ★★☆☆☆
Hardwood floor ★★★☆☆ 【例题10】二进制状态压缩鼻祖
Tetris Comes Back ★★★☆☆ 纸老虎题
Bugs Integrated, Inc. ★★★☆☆ 三进制状态压缩鼻祖
Another Chocolate Maniac ★★★☆☆ 三进制
Emplacement ★★★☆☆ 类似Bugs那题,三进制
Toy bricks ★★★☆☆ 四进制, 左移运算高于&
Quad Tiling ★★★☆☆ 骨牌铺方格 4XN的情况 利用矩阵优化
Eat the Trees ★★★☆☆ 插头DP入门题
Formula 1 ★★★☆☆ 插头DP入门题
The Hive II ★★★☆☆ 插头DP
Plan ★★★☆☆ 插头DP
Manhattan Wiring ★★★☆☆ 插头DP
Pandora adventure ★★★★☆ 插头DP
Tony's Tour ★★★★☆ 插头DP,楼天城“男人八题”之一
Pipes ★★★★☆ 插头DP
circuits ★★★★☆ 插头DP
Beautiful Meadow ★★★★☆ 插头DP
I-country ★★★★☆ 高维状态表示
Permutaion ★★★★☆ 牛逼的状态表示
01-K Code ★★★★☆
Tour in the Castle ★★★★★ 插头DP(难)
The Floor Bricks ★★★★★ 四进制(需要优化)
Anniversary party ★☆☆☆☆ 树形DP入门
Strategic game ★☆☆☆☆ 树形DP入门
Computer ★★☆☆☆
Long Live the Queen ★★☆☆☆
最优连通子集 ★★☆☆☆
Computer Network ★★☆☆☆
Rebuilding Roads ★★★☆☆ 树形DP+背包
New Year Bonus Grant ★★★☆☆
How Many Paths Are There ★★★☆☆
Intermediate Rounds for Multicast ★★★★☆
Fire ★★★★☆
Walking Race ★★★★☆
Tree ★★★★★ 树形DP,楼天城“男人八题”之一
Palindrome ★☆☆☆☆
Telephone Wire ★☆☆☆☆
Gangsters ★☆☆☆☆
Dominoes ★☆☆☆☆
Cow Exhibition ★☆☆☆☆
Supermarket ★★☆☆☆
Print Article ★★★☆☆
Lawrence ★★★☆☆
Batch Scheduling ★★★☆☆
K-Anonymous Sequence ★★★☆☆
Cut the Sequence ★★★☆☆
Divisibility ★★☆☆☆ 利用同余性质
Magic Multiplying Machine ★★☆☆☆ 利用同余性质
Moving Computer ★★☆☆☆ 散列HASH表示状态
Post Office ★★★☆☆ 四边形不等式
Minimizing maximizer ★★★☆☆ 线段树优化
Man Down ★★★☆☆ 线段树优化
So you want to be a 2n-aire? ★★★☆☆ 期望问题
Expected Allowance ★★★☆☆ 期望问题
Greatest Common Increase Subseq ★★★☆☆ 二维线段树优化
Traversal ★★★☆☆ 树状数组优化
Find the nondecreasing subsequences ★★★☆☆ 树状数组优化
Not Too Convex Hull ★★★★☆ 利用凸包进行状态转移
In Action ★★★☆☆ 最短路+背包
Search of Concatenated Strings ★★★☆☆ STL bitset 应用
Common Subsequence 2D/0D
Advanced Fruits 2D/0D
Travel 2D/1D
RIPOFF 2D/1D
Balls 2D/1D
Projects 2D/1D
Cow Roller Coaster 2D/1D
LITTLE SHOP OF FLOWERS 2D/1D
Pearls 2D/1D
Spiderman 2D/0D
The Triangle 2D/0D
Triangles 2D/0D
Magazine Delivery 3D/0D
Tourist 3D/0D
Rectangle 2D/1D
Message 2D/1D
Bigger is Better 2D/1D
Girl Friend II 2D/1D
Phalanx 2D/1D
Spiderman 最坏复杂度O(NK),K最大为1000000,呵呵
Find a path 3D/1D 公式简化,N维不能解决的问题试着用N+1维来求解