![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动规
Rancho__
这个作者很懒,什么都没留下…
展开
-
HUST软件与微电子学院第八届程序设计竞赛-小乐乐下象棋
这题其实很简单,我们可以用一个bfs搜索出所有的,小于k步的,到不同点不同步数的方案数。我们首先初始化,走到(0,0)点的时候,我们把步数设置为0,但是方法数设置为1,这是因为我们走零步,到一个点,确实有一种方法。然后就是bfs,当步数等于k的时候,我们就跳过这点,因为题目中要求是等于k步,即使你搜了大于k步的方案数,我们也用不着。越界判断之后,我么先加上从别的点到达下一个点的方案数,...原创 2018-12-04 11:58:46 · 127 阅读 · 0 评论 -
HDU-1078-FatMouse and Cheese
这题就是记忆化搜索,其实很像数位dp的写法。这题首先,看一眼,甚至看好几眼都看不出边界在哪,让人有点摸不着头脑。所以我们直接开一个dp数组,让dp数组反向更新一个最大值,然后上层的递归直接使用就可以了。这时候边界条件就很明显了,sum = max(sum, dfs(dx, dy)); 也就是说这一个点之后的最大值,应该和下一个点的最大值进行比较更新。最后我们更新dp数组,让它加上这一个点...原创 2019-02-18 10:05:56 · 73 阅读 · 0 评论 -
HDU-2955-Robberies
对于这题来说,我们把钱的总和当做背包的容量,然后递减地更新每次的逃跑概率就行了。对于数据范围,题上说的是每个银行最多有100万,最多有100家银行,所以我们就要开一个10000的数据范围,不然就超时,因为我们是一位数组,节省空间,所以就要开这么大。而且,题中给的是被抓概率,所以我们要减一换算成逃跑的概率,每次的逃跑概率因为是独立的,所以就是他们的乘积就对了。#include <iost...原创 2019-01-31 11:23:36 · 102 阅读 · 0 评论 -
hihoCode-1043-完全背包
我们定义:best(i,x)代表i件以前的物品已经决定好选择多少件,并且在剩余奖券x的情况下的最优解。我们可以考虑最后一步,是否再次选择i物品,在不超过持有奖券总额的情况下。上面的第二个式子的k是大于1的,第一个的k是大于0的,所以第二个还可以再选,体现在式子的左侧,它又减了一次need(i)。对比右侧的两个式子我们发现,它们是一样的,所以当我们计算best(i,x-need(i))的时候...原创 2019-02-10 21:03:56 · 215 阅读 · 0 评论 -
HDU-2050-折线分割平面
对于第n-1条折线,把平面分割的的块数为f(n-1),那么第n条折线想要切割出最多的块数,就要和之前的n-1条折线的2*(n-1)条射线相交,这样的话,交线就是4*(n-1)条。每条交线产生一个块,对于顶角的交线,新产生一块,且4*(n-1)条折线各产生一块,即4*(n-1)+1块。f(n)=f(n-1)+4*(n-1)+1=f(n-2)+4*(n-2)+4*(n-1)+2…=f(1)+...原创 2019-01-30 20:45:19 · 75 阅读 · 0 评论 -
hihoCoder-1038-01背包
这题就是01背包的问题,它首先满足重复子问题,假如有4个物品a、b、c、d,他们的需求和满意从1开始升序。当我们选择a、d和b、c的时候我们都需要求dp[n-1][m-5]这样的一个值,所以满足重复子问题性质。其次满足无后效性,我们无论选择a、d还是b、c,它们的满意度对于我们的结果来说是一样的,它们为什么等于5对我而言没有区别。然后我们可以使用一维数组来存放,是因为,如果dp[i][j]依...原创 2019-02-09 18:20:57 · 140 阅读 · 3 评论 -
HDU-2044-一只小蜜蜂
这题是动态规划的一道题目,我们可以知道,与蜂房n相连的是n-1和n-2,那么我们走到n-1和n-2的方法数就是我们走到n的方法数了。这些点还可以一般化,所以我们直接开一个long long类型的数组就可以了,way【n】就表示,走过的蜂房数目为n(包括起点和终点)的方法数就有way【n】种。所以直接一般化往后推就行了,但是后面的会超出数据范围,所以要开成long long型。#includ...原创 2019-01-30 12:41:30 · 115 阅读 · 0 评论 -
hihocoder-1037-数字三角形
dp的简单题,但是我们不能用dfs写,因为100,搜索太慢了,所以我们就从下往上更新每块的值,让它加上正下方或者斜下方的最大值即可。#include <cstdio>#include <cstring>using namespace std;int dp[105][105];int max(int a,int b) { return a > b ?...原创 2019-02-08 16:06:28 · 129 阅读 · 0 评论 -
HDU-2084-数塔
这个题,我们读入之后,就按照递归的反方向dp就可以了,我们逐层推回原点。#include <iostream>#include <cmath>using namespace std;int num[105][105];int main(){ ios::sync_with_stdio(false); int c, n; scanf("%d...原创 2019-01-29 11:12:38 · 95 阅读 · 0 评论 -
poj-1163 动态规划
这道题目并不能直接使用递归,因为 7(1) 7(1) 7(1) 7(1) 7(2) 7(1) 7(1) 7(3) 7(3) 7(1)7...原创 2018-11-17 20:43:45 · 113 阅读 · 0 评论 -
POJ-1163 递推
代码很容易看明白,就不详解了。这个是空间优化的代码。#include <iostream>#include <algorithm>#define MAX 101 using namespace std;int D[MAX][MAX];int n;int *maxsum;int main(){ cin>>n; for (int i=1...原创 2018-11-18 13:59:13 · 87 阅读 · 0 评论 -
POJ-1458 最长公共子序列
这个题的意思就是说:给一个序列 A 和 B ,让你求他们的共同的子序列的长度,这些子序列可以不在原来的字符串中连续排列。这个题的话,我们可以使用动态规划的思路,我们假设 MaxLen [ i ] [ j ] 是 A 串和 B 串中从一开始的,A 串中的的第 i 个字符和B 串中的第 j 个字符的最长公共子序列的长度。我们可以知道 MaxLen[i][0]是0,并且 MaxLen[0][...原创 2018-11-23 13:51:15 · 76 阅读 · 0 评论 -
OpenJudge-百练-2755-动规
动态规划的话,我们中心思想就是,设一个num数组,num[ i ][ j ] 代表从i的大小中,取出 j 种物品的方法数。当不取j种物品的时候,我们就让num[ i ][ j ] =num[ i ][ j -1 ],并且此时,如果,i-a[j]>=0 的话,说明背包还放得下,所以我们就让num[ i ][ j ] 加上num[ i-a[ j ] ][ j-1 ] ,就可以了。#...原创 2018-11-24 15:21:16 · 81 阅读 · 0 评论 -
POJ-3624-背包问题
它这个问题问的是,在有限的容量下,能装下的最大价值是多少。所以我们可以递归求解,记忆性递归,用二维数组,但是这样的话就会超内存,所以我们只能用动规来写,而且不能开二维数组,只能用滚动数组。我们设一个F数组,大小为13000,它存的是容积为m的背包可放下的最大价值。我们先假设一个二维数组F [ i ][ j ] ,它表示的意思是,背包里放 i 个物品,最大价值为 j ,它的最大价值。...原创 2018-11-24 17:49:50 · 510 阅读 · 0 评论 -
HDU-2041-超级楼梯
这题是一道简单的递归题目,也是一道简单的动规题,我们有两种以上的写法。我们要走到n阶的话,我们肯定要走到n-1阶或者n-2阶。递归#include &amp;lt;cstdio&amp;gt;int f(int n){ if (n==1) return 1; if (n==2) return 2; return f(n - 1) + f(n - ...原创 2019-01-30 15:58:02 · 119 阅读 · 0 评论