hdu dp46题

【原创】转载请说明出处!

动态规划:利用问题的最优性原理,以自底向上的方式,从子问题的最优解,逐步构造出整个问题的最优解。                                

1.HDOJ 1864 最大报销额                                

0 1 背包,范围内的最大值                         

i从0到最后递推,每次dp[ i ] = max( dp[ j ] )+fapiao[ i ]) ;   0 =< j < i;                               

2.hdoj 2602 Bone Collector

0 1 背包   ,范围内的最大值                         

状态转移方程 f [ j ] = max ( f [ j ] , f [ j - w [ i ] ] + v [ i ] );    j 表示容量                             

3.hdoj 1203 i need a offer

01 背包   ,范围内的最小值                         

题意要求至少有一张offer的最大概率,即1减去 一张也得不到时的最小概率。                            

状态转移方程:f[ j ] = min(f[ j] , f[ j - m[i]] * g[i] ) ;    j表示钱                            

4.hdoj 2955 Robberies

0 1背包  ,范围内的最大值                         

一开始没注意到这里概率是相乘的,而非相加,所以以概率为背包贡献了一个WA。                           

状态转移方程:f [ j ] = max ( f [ j ] , f [ j - m [ i ]] * g[i] ) , 这里,j是抢到的钱,f[ j ]为抢到 j 钱的概率,                           

g [ i ] 为对应的没抓到的概率。                           

5.poj 2063 Investment

完全背包 ,容量内的最大值                         

状态压缩:由于利息最大为10%,本金最多为1000 000,而且债券都为1000的倍数,                          

                     所以,背包最大值为:1000 000 * (1.1 ^40)/ 1000 = 45259 ;                          

状态转移方程: f [ j + v[ i ] ]  = max ( f [ j + v[ i ] ] , f [ j ] + w [ i ] ] ) ;                          

6.poj 1384 Piggy-Bank

完全背包,求恰好装满的最小值。                         

f [] 初始值设为-1 , f [ 0] = 0;                         

状态转移方程:f [ j + v[i] ] = min ( f [ j + v[i] ] , f [ j ] + w[i] );                         

7.poj 2392 Space Elevator

多重背包  ,                       

此类题目都是背包的cost 和 weight相同                       

f [ j ] = f [ i ] + w[i]*( 1 … N)                       

8.poj 1276 Cash Machine

多重背包,和poj 2392差不多,                      

9.hdoj 2191 珍惜现在,感恩生活

典型多重背包,此时cost != weight.即把多重背包转化成完全背包或者0 1 背包。                      

10.hdoj 2059 龟兔赛跑

一维数组的更新。把起点和终点,以及中间的n个充电站看做n+2个点,                     

长度为n+2的数组里保存到达该站点所需时间的最优解。                     

而f [ i ] 的最优解,便是从0 到 i-1 里面某个站充满电一直开到 i 站的最小值                     

f [ i ]  = min ( f [ j ] + time( j  - > i) );                      

11.hdoj 1059 Dividing

这题可以看做cost 等于weight那种题型。是否有总数一半的情况。                    

12.hdoj 1231 最大连续子序列

求最大连续子串                  

dp[ j ] = max ( dp[j-1] + num[ i] , num[i] ) ;                   

13.hdoj 1003 max sum

最大连续子串,同hdoj 1231                  

14.hdoj 1087 Super Jumping! Jumping! Jumping!

求最大上升子串                 

15.hdoj 2845 Beans

横着或者竖着求一下,变成一维的,然后再求一次。                

状态转移方程:f [ j ] = max( f [ j -1 ] , f [ j - 2] + a[ j] ) ;                

16.hdoj 1159 Common Subsequence

一个最优结构有三个最优子结构,f [ i ][ j ] = max ( f [ i -1][ j -1] , f[ i ] [ j -1], f[i -1][ j ] );               

17.hdoj 1506 Largest Rectangle in a Histogram

每一块的最大面积 = 这块的高度 * 包含这块的最大长度,每一块的长度分为左边长度和右边长度,且初始值为 1 。              

而如果左边的长度大于它,则应加入左边的长度,依次往左边递归。               

18.hdoj 1505 City Game

和hdoj 1506差不多             

19.hdoj 2571 命运

状态转移方程:dp[i][ j ] = max( dp[i-1][ j ] , dp[i][ j-1] , dp[i][ k])  + num[i][ j]   k 为 j 的因子            

20.hdoj 1069 Monkey and Banana

解题思路可以理解为求最大上升子序列           

21.hdoj 1171 Big Event in HDU

可以看做cost 等于weight的多重背包(母函数也可以做)          

即背包容量等于总值一半,然后求背包消耗内的最大值。          

22.doj 1176 免费馅饼

数塔,按时间逆序DP。         

23.hdoj 2159 FAFE

二维完全背包        

状态转移方程: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个怪提供的经验值        

24.hdoj 2577 how to type

如果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反之。       

25.hdoj 2844 coins

不说了,看成cost 等于weight的背包      

26.hdoj 2830 Matrix Swapping II

dp第一次排第一,纪念下。     

求最大子矩阵,且列的顺序可以移动。用hash保存每个高度的个数,然后从高到底,hash [ i ] += hash[i + 1];  则,area = i * hash[ i ];     

27.hdoj 2870 Largest Submatrix

最终的最大矩阵不是a,就是b,或者是c。分别枚举三种情况就可以了    

28.hdoj 1789 Doing Homework again

贪心。尽量先做扣分多的,然后尽量往后做。   

29.hdoj 1978 How many ways

起初用点加上左上角可达的点的值,超时了。改成点的值加到它可达的点上去,这样显然要省去一些不必要的操作  

30.hdoj 1881 毕业bg

先离开的先举行,按离开的时间排序。 

状态转移方程:dp[ j ] = max ( dp[ j - bg[i].l ] + bg[i].h , dp[ j ] ); 

你可能感兴趣的:(刷题代码)