随笔分类 - 动态规划
摘要:dp[i][j]表示前i个元素,子集和为j的个数。d[i][j] = d[i][j] + d[i-1][j-k] (第i个元素的值为k)。这里可以优化成一维数组 比如序列为 1 2 3,每一步的dp值为 1 0 0 0 0 0 0 (d[0][0]=1) 1 1 0 0 0 0 0 1 1 1 1
阅读全文
摘要:Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经
阅读全文
摘要:[编程题] 拼凑钱币 时间限制:1秒 空间限制:32768K 给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。 输入描述: 输入包括一个整数n(1 ≤ n ≤ 10000) 输出描述: 输出一个
阅读全文
摘要:大致题意: 给你9堆扑克牌,每堆牌有4张,大小从A~K。每次从9堆牌牌顶抽走两张大小相同的牌,且抽走每一对相同的牌的概率都相等。问可以全部抽完的概率。 分析: 这是一道概率dp题。剩余的牌数作为状态,有9堆,意味着要一个9维数组来存d[i1][i2][i3][i4][i5][i6][i7][i8][
阅读全文
摘要:分析: 这一题给出的遍历的点的序列,不是树的中序遍历,前序遍历,只要遇到一个节点就打印一个节点。关键点就在,这个序列的首字母和尾字母一定要相同,因为最终都会回到根节点,那么每一个子树也一样。 状态: d[i][j]表示i至j的状态数 d[i][j]= d[i][j]=(d[i][j]+dp(i,k)
阅读全文
摘要:题目大意: 一共n块木板,前两个数给出最底下木块的两个端点,后面n-1个数给出第i层的一个固定端点,问你木块的所有放置情况。 分析: 状态: d[i][j]表示第i个木块,第i-1块木板的未固定端点为j的所有方案数 状态转移: 如果a[i]<=min(j,a[i-1),也就是说固定的那一点在i-1块
阅读全文
摘要:大致题意: n场比赛,k个钱币。赢一场获得一个钱币,输一场失去一个钱币,一旦钱币数量为2k个或者0个,就马上离开比赛。给出n个长度字符串,由W,D,L,?四个字符组成,W表示赢,L表示输,D表示平局,?表示前三种情况的一种。 问此字符串是否是合法的赛事,如果合法,输出其中任意一种情况。 分析: 状态
阅读全文
摘要:大致题意: 有v个村庄,每个村庄有各自的位置,且每个位置互不相同。现在要在村庄上设立P个邮局,使每个村庄到最近的邮局的距离之和最小。 分析: 定义状态d[i][j]表示前i个村庄,在这i个村庄中设立j个邮局的最小距离。s[i][j]表示村庄i至村庄j这几个村庄中设立一个邮局的最小距离。如果设立一个邮
阅读全文
摘要:[编程题] 堆砖块 小易有n块砖块,每一块砖块有一个高度。小易希望利用这些砖块堆砌两座相同高度的塔。为了让问题简单,砖块堆砌就是简单的高度相加,某一块砖只能使用在一座塔中一次。小易现在让能够堆砌出来的两座塔的高度尽量高,小易能否完成呢。 输入描述: 输入包括两行: 第一行为整数n(1 ≤ n ≤ 5
阅读全文
摘要:普通01背包再加一维 状态:d[i][j]代表:有i个球,j体力,最多能捕获多少精灵 状态转移:d[i][j]=max(d[i][j],d[i-num[k]][j-val[k]]+1); k为精灵的编号,第k个精灵。 边界情况d[i][0]=d[0][j]=0,都初始化为0也行。 最后找到所剩的体力
阅读全文
摘要:题意: 某城市地铁是线性得,有n个车站,从左到右编号为1至n。有M1辆列车从第1站开始往右开,有M2辆列车从第n站开始往左开。在时刻0,Mario从第1站出发,目的是在时刻T会见车站n得一个间谍。在车站等车时容易被抓,所以她决定尽量躲在开动的火车上,让在车站等待的总时间尽量短。列车靠站停车时间忽略不
阅读全文
摘要:状态:d[i]代表n=i时的方案数。 状态转移方程:d[i]=d[i-2]+2*(d[i-2]+d[i-4]+…+d[0]) i只会为偶数,奇数情况不存在,d[0]=1 找状态转移方程的时候画图更好理解。
阅读全文
摘要:解析:状态d[i][j]代表r=i , c=j这个位置能滑的最大长度。深搜+备忘录
阅读全文
摘要:大致题意:现有两种方块(1X2,2X2),方块数量无限制。问用这两种方块填满2Xn的矩阵的填法有多少种。 分析:通俗点说,找规律。专业化一点,动态规划。 状态d[i],表示宽度为i的填法个数。 状态转移方程:d[0]=d[1]=1,i=0,1; d[i]=d[i-1]+d[i-2]*2; c或者c+
阅读全文
摘要:大致题意: 求最大子矩阵和 分析: 一开始想复杂了,推出了一个状态方程:d[i][j]=max(d[i][j-1]+…,d[i-1][j]+…)。写着写着发现上式省略的部分记录起来很麻烦。 后来发现n最大100,干脆直接枚举行,先枚举所有行的情况,然后将矩阵压缩为数列,最后用最大子段和求解。写着写着
阅读全文
摘要:大致题意: 从n个候选人中选出m个人作为陪审团。为了让陪审团的选择更公平,辩方和控方都为这n个候选人给出了满意度(辩方为D[j],控方为P[j],范围0至20).现在要使得选出的m位候选人的辩方总和与控方总和的差最小,如果有多个最小,选择辩方总和与空方总和的和最大的那个方案。 分析: 一开始以为就是
阅读全文
摘要:大致题意:有n头牛,有些牛朝正面,有些牛朝背面。现在你能一次性反转k头牛(区间[i,i+k-1]),求使所有的牛都朝前的最小的反转次数,以及此时最小的k值。 首先,区间反转的顺序对结果没有影响,并且,同一区间无需进行多次反转。我们首先从最左边的开始,最左边的牛如果朝前,则不需要反转,用f[i]=0记
阅读全文
摘要:大致题意:给出一队士兵的身高,一开始不是按身高排序的。要求最少的人出列,使原序列的士兵的身高先递增后递减。 求递增和递减不难想到递增子序列,要求最少的人出列,也就是原队列的人要最多。 1 2 3 4 5 4 3 2 1 这个序列从左至右看前半部分是递增,从右至左看前半部分也是递增。所以我们先把从左只
阅读全文
摘要:最大子段和: dp[i]的值是从左至右包含a[i]的最大的子段和。dp[i]中最大的即整个串的最大的子段和。 最长公共子序列: 状态转移方程: if(i==0 || j==0) dp[i,j]=0; else if(X[i]==Y[j]) dp[i,j]= dp[i-1,j-1]+1; else d
阅读全文