动态规划分为单三个步骤:
1、定义与一个数组,且数组含义要清晰;
2、找出dp[n]和dp[n -1]或dp[n-2]的关系式;
3、计算初始值,找出初始条件;
例题一:小偷面前有N个房间,这N个房间内装着不同数量的财宝,限制条件:不能进入相邻的两个房间,否则会出发报警装置;则请找出在不触发报警装置的情况下,该小偷能偷到的最大财宝数
1、先定义N个房间的财宝数为:num[n];N个房间能偷盗的最大财宝数为dp[n];
2、分为两种情况,(1)当相邻的房间被偷,那么此次就不能再偷,有dp[n]=dp[n-1];(2)当相邻房间未被偷,则此次能偷盗的财宝数为上次偷的财宝数加上最后这个房间的财宝数,比较两者中谁大,谁大选谁;
3、初始条件,当房间数为1 时。dp[1]=num[1];当房间数为2时,选最大的;
代码如下(matlab)
%题:有N个房间,且房间内财宝数量不一样,不能头相邻的房间,求能偷到的最大财宝数 k=[2,8,2,9,5,12,9,18]; m = cacu_maxgolden(k); function [golden_num]=cacu_maxgolden(nums) [~,a]= size(nums); dp = []; dp(1)=nums(1); if(a == 1) dp(1) = nums(1); end if(nums(1)>nums(2)) dp(2) = nums(1); else dp(2)= nums(2); end for i =3:1:a if((nums(i)+dp(i-2))>dp(i-1)) dp(i) = nums(i)+dp(i-2); else dp(i)= dp(i-1); end end golden_num = dp(a); end
题2:有一任一矩阵,某人从左上角开始走,每次只能走一格,从找出一条从左上角到右下角的路径,使得走到的数值加起来最小;
data=[1 5 9;24 10 45;1 12 18;22 4 8;1 4 8;5 34 12]; a = minpaths(data); function [m]=minpaths(data) [m,n] = size(data); dp = zeros(m,n);%dp(m ,n)定义为,当机器人走过(m ,n)时,最小路径和为dp(m,n) dp(1,1) = data(1,1); for i=1:1:m dp(m,1) = dp(m-1,1) + data(m ,1); end for i = 1:1:n dp(1,n) = dp(1,n-1) + data(1,n); end for m = 2:1:m for n = 2:1:n dp(m,n) = max(dp(m,n-1),dp(m-1,n)) + data(m,n); end end m = dp(m,n); end