比较经典的动态规划的题目了
一般动态规划的想法都是先判断是否有最优子结构,无后效性。接着从状态转移入手,尽量细分状态(即给定N得到N+1),完了再递推计算
难点:转移方程,其一般也难在如何描述一个结点
有时候不太好做就结合使用记忆化搜索(从大到小搜索,因为多个小的可能会组成一个大的导致无效计算过多)
/**************************************...
                            
                            
                                分类:
其他好文   时间:
2014-08-12 09:04:43   
                                阅读次数:
181
                             
                    
                        
                            
                            
                                题意:给出n纪念品的价格和钱数m,问最多能买多少件纪念品和买这些数量的纪念品的方案数。首先,求能买最多的纪念品的数量,用贪心法可以解决。将价钱排序,然后从最便宜的开始买,这样就很容易求得最多买的纪念品的数量。方案数就要用到动态规划。dp[j][k]表示花费不超过j元买k件物品的方案数dp[j][k]...
                            
                            
                                分类:
其他好文   时间:
2014-08-12 09:00:03   
                                阅读次数:
160
                             
                    
                        
                            
                            
                                1.什么是动态规划?看了很多题解,一般解决者开始就说用DP来解,然后写了嵌套的for循环,不是很容易看懂,但是确实解出来了,我们这次来看下到底什么是动态规划?它有什么特点呢?容我抄一段话:动态规划(Dynamic programming,DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的...
                            
                            
                                分类:
其他好文   时间:
2014-08-12 03:06:23   
                                阅读次数:
248
                             
                    
                        
                            
                            
                                #include int fib(int n){if(nint fib(int n){ if(n#define MAX 50+1int a[MAX];int fib(int n){ if (a[n]==-1) return a[n]=fib(n-1)+fib(n-2)...
                            
                            
                                分类:
其他好文   时间:
2014-08-12 00:24:53   
                                阅读次数:
259
                             
                    
                        
                            
                            
                                n==10 20 30 40 50 46 体验一下,感受一下,运行时间#include int fib(int n){	if (nint fib(int n){	if (nint fib[50]={0,1}; //使用打表void in...
                            
                            
                                分类:
其他好文   时间:
2014-08-11 23:57:53   
                                阅读次数:
530
                             
                    
                        
                            
                            
                                题意    吃豆子游戏    当你吃了一个格子的豆子   该格子左右两个和上下两行就不能吃了    输入每个格子的豆子数    求你最多能吃多少颗豆子
可以先求出每行你最多可以吃多少颗豆子   然后每行就压缩成只有一个格子了   里面的豆子数就是那一行最多可以吃的豆子数   然后问题就变成求一列最多可以吃多少颗豆子了   和处理每一行一样处理   那么问题就简化成求一行数字的最大不连续和问题了
令d[i]表示某一行前i个豆子的最大和  有两种情况  吃第i个格子中的豆子和不吃第i个格子中的豆子  a[i]为...
                            
                            
                                分类:
其他好文   时间:
2014-08-11 21:23:02   
                                阅读次数:
333
                             
                    
                        
                            
                            
                                题意  求最大相同字符子矩阵  其中一些字符可以转换
其实就是HDU1505 1506的加强版  但是分了a,b,c三种情况  看哪次得到的面积最大
对于某一个情况  可以把该字符和可以转换为该字符的位置赋值0 其它位置赋值1 这样就转化成了求最大全0矩阵的问题了
对于转换后矩阵中的每个点 看他向上有多少个连续0 把这个值存在h数组中 再用l数组和r数组记录h连续大于等于该位置的最左边位置和最右位置 这样包含(i,j)点的最大矩阵面积就是(r[i][j]-l[i][j]+1)*h[i][j] 面积最大的点就...
                            
                            
                                分类:
其他好文   时间:
2014-08-11 15:04:42   
                                阅读次数:
195
                             
                    
                        
                            
                            
                                先把物品重量从小到大排序 d[i][j]表示前i件物品选j对的最小疲劳 
若选了第i个物品  那么和它一对的必是第i-1个物品  注意是前i件
i=j*2时  没有选择 d[i][j]=d[i-2][j-1]+(w[i]-w[i-1])^2
i>j*2时  存在第i个选或者不选之分
若选了第i个的话  那么问题就转化为在i-2个物品中选j-1个了
若不选第i个的话  问题转化为在i-1个物品中选j个了
那么就有转移方程d[i][j]=min(d[i-1][j],d[i-2][j-1]+(w[i]-w[i-1...
                            
                            
                                分类:
其他好文   时间:
2014-08-11 12:09:32   
                                阅读次数:
177