动态规划:利用问题的最优性原理,以自底向上的方式,从子问题的最优解,逐步构造出整个问题的最优解。
1.HDOJ 1864 最大报销额
0 1 背包,范围内的最大值
i从0到最后递推,每次dp[ i ] = max( dp[ j ] )+fapiao[ i ]) ; 0 =< j < i;
0 1 背包 ,范围内的最大值
状态转移方程 f [ j ] = max ( f [ j ] , f [ j - w [ i ] ] + v [ i ] ); j 表示容量
01 背包 ,范围内的最小值
题意要求至少有一张offer的最大概率,即1减去 一张也得不到时的最小概率。
状态转移方程:f[ j ] = min(f[ j] , f[ j - m[i]] * g[i] ) ; j表示钱
0 1背包 ,范围内的最大值
一开始没注意到这里概率是相乘的,而非相加,所以以概率为背包贡献了一个WA。
状态转移方程:f [ j ] = max ( f [ j ] , f [ j - m [ i ]] * g[i] ) , 这里,j是抢到的钱,f[ j ]为抢到 j 钱的概率,
g [ i ] 为对应的没抓到的概率。
完全背包 ,容量内的最大值
状态压缩:由于利息最大为10%,本金最多为1000 000,而且债券都为1000的倍数,
所以,背包最大值为:1000 000 * (1.1 ^40)/ 1000 = 45259 ;
状态转移方程: f [ j + v[ i ] ] = max ( f [ j + v[ i ] ] , f [ j ] + w [ i ] ] ) ;
完全背包,求恰好装满的最小值。
f [] 初始值设为-1 , f [ 0] = 0;
状态转移方程:f [ j + v[i] ] = min ( f [ j + v[i] ] , f [ j ] + w[i] );
多重背包 ,
此类题目都是背包的cost 和 weight相同
f [ j ] = f [ i ] + w[i]*( 1 … N)
多重背包,和poj 2392差不多,
典型多重背包,此时cost != weight.即把多重背包转化成完全背包或者0 1 背包。
一维数组的更新。把起点和终点,以及中间的n个充电站看做n+2个点,
长度为n+2的数组里保存到达该站点所需时间的最优解。
而f [ i ] 的最优解,便是从0 到 i-1 里面某个站充满电一直开到 i 站的最小值
f [ i ] = min ( f [ j ] + time( j - > i) );
这题可以看做cost 等于weight那种题型。是否有总数一半的情况。
求最大连续子串
dp[ j ] = max ( dp[j-1] + num[ i] , num[i] ) ;
最大连续子串,同hdoj 1231
求最大上升子串
横着或者竖着求一下,变成一维的,然后再求一次。
状态转移方程:f [ j ] = max( f [ j -1 ] , f [ j - 2] + a[ j] ) ;
一个最优结构有三个最优子结构,f [ i ][ j ] = max ( f [ i -1][ j -1] , f[ i ] [ j -1], f[i -1][ j ] );
每一块的最大面积 = 这块的高度 * 包含这块的最大长度,每一块的长度分为左边长度和右边长度,且初始值为 1 。
而如果左边的长度大于它,则应加入左边的长度,依次往左边递归。
和hdoj 1506差不多
状态转移方程:dp[i][ j ] = max( dp[i-1][ j ] , dp[i][ j-1] , dp[i][ k]) + num[i][ j] k 为 j 的因子
解题思路可以理解为求最大上升子序列
可以看做cost 等于weight的多重背包(母函数也可以做)
即背包容量等于总值一半,然后求背包消耗内的最大值。
数塔,按时间逆序DP。
二维完全背包
状态转移方程:f [ j + r[i] ] [ k + 1 ] = max ( f [ j ] [ k ] + jy[ i ] , f [ j + r[i] ] [ k + 1 ] ) ; j : 表示忍耐度,k表示个数,r[i]即杀第i个怪所需的忍耐度,
jy[i]指第i个怪提供的经验值
如果str[i]大写:on[i] = min(on[i-1]+1, down[i-1]+2); down[i] = min(on[i-1]+2, down[i-1]+2);
如果str[i]小写:on[i] = min(on[i-1]+2, down[i-1]+2);down[i] = min(on[i-1]+2, down[i-1]+1);
on[i]表示按下第i个字母后灯是亮的,down反之。
不说了,看成cost 等于weight的背包
dp第一次排第一,纪念下。
求最大子矩阵,且列的顺序可以移动。用hash保存每个高度的个数,然后从高到底,hash [ i ] += hash[i + 1]; 则,area = i * hash[ i ];
最终的最大矩阵不是a,就是b,或者是c。分别枚举三种情况就可以了
贪心。尽量先做扣分多的,然后尽量往后做。
起初用点加上左上角可达的点的值,超时了。改成点的值加到它可达的点上去,这样显然要省去一些不必要的操作
先离开的先举行,按离开的时间排序。
状态转移方程:dp[ j ] = max ( dp[ j - bg[i].l ] + bg[i].h , dp[ j ] );