比较经典的动态规划的题目了
一般动态规划的想法都是先判断是否有最优子结构,无后效性。接着从状态转移入手,尽量细分状态(即给定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