dp
文章平均质量分 58
克莉丝汀娜
此时一名自称平民的玩家路过
展开
-
510D Fox And Jumping(dp+gcd)
有一条无限长的条带,上面有带编号的格子,由负到正。(相当于一条数轴)现有n张卡片,上面记载着长度和花费。获取第i张卡片需要花费c[i],然后可以跳l[i]个距离到x+l[i]或者x-l[i]的位置(购买卡片后可重复使用),初始在0这个位置。问最少要花费多少可以跳到条带的任意位置。要跳到任意位置,只需购买的所有卡片的长度的最大公约数为1。设两数为x,y,其最大公约数为m。a、原创 2015-02-05 16:12:02 · 549 阅读 · 0 评论 -
hdu 5492 Find a path (DP)
题目大意:给N*M(1(N+M−1)∑N+M−1i=1(Ai−Aavg)2最小值。将式子展开后,化简整理可得:(N+M-1)*s1-s2。其中s1是序列A的平方和,s2是序列A的和的平方。设dp[i][j][k]表示到达(i,j),序列和为k时,序列的平方和的最小值。那么很容易得到状态转移方程,对于向右走,有:dp[i][j+1][k+V[i][j+1]]=mi原创 2015-09-27 20:52:25 · 1942 阅读 · 2 评论 -
编辑距离(DP)
给定两个字符串S和T,对于T我们允许三种操作:(1) 在任意位置添加任意字符(2) 删除存在的任意字符(3) 修改任意字符 问最少操作多少次可以把字符串T变成S?让串S和T的最长公共序列对齐,然后空出来的部分用'-'填充。比如:S="ABCD",T="DBDE",对齐之后有ABCD-DB-DE(1) S,T对应位置都是普通字符,相同,则需进行操作。原创 2015-10-01 16:50:01 · 456 阅读 · 0 评论 -
hdu 2844 coins (多重背包+二进制优化)
给出n种面值的硬币,以及它们的数量,问能组成不超过m的面值有多少个。样例2解释:2 51 4 2 1面值为1的硬币2个,面值为4的硬币1个。能组成的面值有1、2、4、5、6。其中不超过面值5的面值有4个。典型的多重背包问题。这里的面值既相当于背包问题中的物品体积,又相当于物品的价值。因此dp[i]表示的是能组成的不超过i的最大面值,即dp[i]k且dp原创 2015-10-04 14:57:43 · 455 阅读 · 0 评论 -
子序列个数(DP)
子序列的定义:对于一个序列a=a[1],a[2],......a[n]。则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1例如4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。对于给出序列a,有些子序列可能是相同的,这里只算做1个,请输出a的不同子序列的数量。由于答案比较大,输出Mod 10^9 + 7的结果即可。输入原创 2015-10-04 23:07:16 · 600 阅读 · 0 评论 -
51nod 1084 更难的矩阵取数问题(DP)
原题链接:点击打开链接一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上。第1遍时只能向下和向右走,第2遍时只能向上和向左走。两次如果经过同一个格子,则该格子的奖励只计算一次,求能够获得的最大价值。 例如:3 * 3的方格。1 3 32 1 32 2 1能够获得的最大价值为:17。1 ->原创 2015-10-04 22:06:37 · 1485 阅读 · 0 评论 -
poj 3254 Corn Fields (状压DP)
题目大意: N*M的农场, 有的格子可以放牛,有的不行。在这块地方放牛,相邻的格子不能有牛。求方案数。N、M都比较小(<13),那么可以用1个2进制位表示一行中的每一个格子的状态,0表示不放牛,1表示放牛,一行中的所有二进制位构成一个状态s。设dp[i][s]表示第i行状态为s时的方案数。那么状态转移方程:dp[i][s]=∑(dp[i−1][s′])dp[i][s]= \sum (dp[i-1][原创 2015-10-07 11:16:20 · 87 阅读 · 0 评论 -
poj 3001 Travelling (状压DP)
每个顶点最多可访问两次的TSP问题。 对于每个顶点,用一个三进制位表示其访问次数,则n个顶点的状态为n位3进制数。 设dp[i][j]表示在状态i下到达顶点j的最小花费。 有状态转移方程: dp[i+3j−1][j]=min(dp[i+3j−1][j],dp[i][k]+dis[k][j])dp[i+3^{j-1}][j]=min(dp[i+3^{j-1}][j],dp[i][k]+dis[原创 2015-10-08 22:13:17 · 407 阅读 · 0 评论 -
poj 1185 炮兵阵地(状压DP)
和上一题有点类似。不过对于当前的第i行状态,除了牵涉到第i-1行的状态外,还和第i-2行的状态有关。 考虑枚举前两行的状态,来进行状态转移: 设dp[i][s][s1]表示第i行状态为s、第i-1行状态为s1时,能安置最多炮兵的数量。 分别枚举第i-1和i-2行的状态s1、s2,有: dp[i][s][s1]=max(dp[i][s][s1],dp[i−1][s1][s2])dp[i][s]原创 2015-10-07 22:41:52 · 349 阅读 · 0 评论 -
poj 3311 Hie with the Pie (DP)
解法#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;#define maxn 12typedef __int64 LL;#define inf 0x3f3f3f3fint D[maxn][maxn];int dp[1<<maxn][maxn];void原创 2015-10-08 17:08:16 · 311 阅读 · 0 评论 -
poj 2282 Islands and Bridges(状压DP)
n个点,m条无向边,问是否存在哈密顿路,若存在,最大的边权和是多少?与之对应的路的条数有多少条? 边权和的计算方法:所有顶点的权值+相邻顶点权值的乘积 若相邻三个点两两之间都有边,则还需加上它们的权值的乘积考虑用一个二进制位表示某个顶点是否被访问。用n个二进制位表示一个状态。 注意到,每一个状态和前一个走过的顶点以及上上个走过的顶点有关。 因此,设dp[s][i][j]表示在状态s下,经过顶原创 2015-10-09 19:57:45 · 274 阅读 · 0 评论 -
ZOJ 3471 Most Powerful (状压DP)
n(<=10)种气体,两两相互碰撞会使得其中一种气体消失,同时释放出能量。问最多能释放出多少能量。 用一个2进制位表示气体是否存在,n种气体对应n位2进制位,表示一个状态。 设dp[i]表示在状态i下释放出的最大能量。 状态转移方程: dp[i]=max(dp[i],dp[i′]+a[k][j])dp[i]=max(dp[i],dp[i']+a[k][j])其中a[k][j]为气体k碰撞气体原创 2015-10-09 08:42:58 · 370 阅读 · 0 评论 -
poj 2411 Mondriaans Dream (状压DP)
比较容易理解的解法是直接枚举两行的状态。时间复杂度略高O(n*4^m)。 思路参考了该大牛的:请戳#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;#define maxn 11typedef __int64 LL;LL dp[12][1<<11];in原创 2015-10-10 15:12:32 · 446 阅读 · 0 评论 -
骨牌覆盖问题三(k*N棋盘覆盖)
骨牌覆盖问题一 骨牌覆盖问题二 骨牌覆盖问题三#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>using namespace std;#defi原创 2015-10-11 11:25:58 · 1610 阅读 · 0 评论 -
CCF 201312-4 有趣的数 (数位DP)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。 3. 最高位数字不为0。 因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的有趣的数还有两个:2031和2301。 请计算恰好有n位的有趣的数的个数。由于答案可能原创 2015-09-04 19:57:39 · 1441 阅读 · 0 评论 -
hdu 5389 Zero Escape(dp)
给A、B还有n个数,问将这n个数分为两组,使得一组中所有数的和的数根为A,另一组为B,共有多少种方案。(其中一组中数的个数可以为0)分析:1、关于数根的计算:一个数x(x>0)的数根为:(x-1)%9+12、两个数的数根分别为x,y(x,y>9),则这两个数之和的数根为(x+y-1)%9+13、由于所有数都会被分到某一组,即如果一组数选定了,那么另一组的所有数的和的数根原创 2015-08-14 09:05:24 · 352 阅读 · 0 评论 -
234F fence (DP)
题目传送门题目大意:给一个条形图涂色,每一列都是由边长为1的正方形组成。每一次将一列涂成红色或者绿色。涂成红色、绿色的正方形个数不超过a、b。当相邻两列颜色不同时,取较小者的高度作为权值。求最小权值。设dp[i][j][0]表示将第i列涂成红色后,红色数量为j时的最小权值。 dp[i][j][1]表示将第i列涂成绿色后,红色数量为j时的最小权值。#includeus原创 2015-02-11 10:12:27 · 673 阅读 · 0 评论 -
132C Logo Turtle
题目传送门给一个含有T、F的字符串,T表示转向,F表示前进1格。现在可以把其中的T改为F,或F改为T,改变n次(可重复改变某一位置的字母),问相对于起点最远能走多远。考虑每一个命令,选择改变或者不改变,当前的决策对于以后产生的影响就是,停在了哪个位置,正朝着哪个方向。由此可以设出状态:dp[i][j][k][d]表示前i个命令,使用了j次机会,当前停留在k位置,正朝着d方向原创 2015-02-11 10:27:33 · 702 阅读 · 0 评论 -
225C (DP)
225C一个n*m的图形,含有黑白像素。最少需要改变其中多少个像素使其每一列的像素颜色相同。且连续的颜色相同的像素带的宽度均在区间[x,y]之间。对于每一列,显然,要么把白色都改变为黑色,要么把黑色都变为白色。先统计每一列的黑白像素的数量,由于每一列的像素数量是确定的,为n,故只需统计每一列的白色像素数量即可。亦可统计其前i列的白色像素数量。这里设num[i]表示前i列的白色像素数原创 2015-03-26 10:01:46 · 352 阅读 · 0 评论 -
166E(DP)
一个顶点分别为A、B、C、D的四面体。每一步可从一个顶点走到另一个顶点,问从D出发经过n步回到D的方法数。设dp[i]表示走i步回到D的方法数。每走一步共3种可能,走n步共3^n种情况,用总的方法数减去走n-1步回到D的方法数,即为走n步回到D的方法数。即dp[n]=3^n-dp[n-1] #includeusing namespace std;#define MOD 10原创 2015-03-26 10:00:26 · 480 阅读 · 0 评论 -
505C (DP)
//题意:30001个岛屿自西向东依次编号为0-30000,输入n个编号,表示该岛屿上有宝藏。//从编号为0处出发向东跳,第一次跳的距离为d。设上一次跳的距离为L(L>0),则当前跳的距离为L-1(L>1)或L或L+1//输出最多能拿的宝藏数目//以p[i]表示第i个岛屿的宝藏数目,dp[i][j]表示跳了距离j到第i个岛屿所获得的最多宝藏数,则状态转移方程为:// dp原创 2015-03-26 09:37:25 · 408 阅读 · 0 评论 -
507D (数位DP)
/*求后缀中(大于0)存在能被k整除的n位数的个数从低位向高位按位DPdp[0][i][j] 后缀均不能被k整除、被k除余j、位数为i的数的个数dp[1][i][j] 存在能整除k的后缀、被k除余j、位数为i的数的个数*/#includeusing namespace std;typedef __int64 LL;LL dp[2][1002][102原创 2015-03-26 09:40:41 · 439 阅读 · 0 评论 -
264B (DP)
给一个递增的序列,求相邻元素不互质最长子序列的长度设dp[i]表示当前最后一位中含因子i的最长长度,则每输入一个数,找到它所有因子,更新维护数组dp即可,这样可避免求gcd#includeusing namespace std;#define maxn 100005vector m[maxn]; //m[i]存放数i含有的因子。int dp[maxn];//当前数中含原创 2015-03-26 09:56:48 · 461 阅读 · 0 评论 -
514E (矩阵快速幂+DP)
一棵树,每个结点有n个儿子,该第i个儿子到父节点的距离为d[i],问离根节点距离不超过x的结点有多少个,结果对1e9+7取模。之前写的了,忘记是参考哪个大牛的博客了:以下是他的分析 首先注意到每个di * 用dp[i]表示到根节点长度为i的点的个数, 那么不难发现状态转移方程 * dp[x] = dp[x - 1]*t[1] + dp[x - 2]*t[2] + ... +原创 2015-03-26 10:27:09 · 437 阅读 · 0 评论 -
SGU 104 Little shop of flowers
import java.util.Scanner;public class Main { public static int dp[][] = new int[110][110], cost[][] = new int[110][110], pos[][] = new int[110][110], m, n; public static void pr原创 2015-03-08 18:34:36 · 396 阅读 · 0 评论 -
codeforces 4D Mysterious Present
题意:n个信封,第i个信封宽w[i],高h[i],现有宽为w,高为h的卡片,求满足下面条件的信封序列:1、宽、高大于卡片的宽、高2、序列中第i个信封宽、高严格小于第i+1个信封的宽、高分析:对于条件1,可以在输入时就把满足条件的信封记录下来;对于条件2,对满足条件1的信封按照宽由小到大排序。因为宽已经按照由小到大排序了,于是只需高度满足后者大于前者即可,所以对排好序的信封的原创 2015-03-31 20:15:45 · 703 阅读 · 0 评论 -
动态规划最优化原理与无后效性
原文地址:http://www.jzsyz.jzedu.cn/xxjs/Suanfa/dtguihua/index.htm上面已经介绍了动态规划模型的基本组成,现在需要解决的问题是:什么样的“多阶段决策问题”才可以采用动态规划的方法求解? 一般来说,能够采用动态规划方法求解的问题必须满足.最优化原理和.无后效性原则。(1)动态规划的最优化原理。作为整个过程的最优策略具有如下性转载 2015-03-31 22:07:42 · 2755 阅读 · 0 评论 -
hdu 1024 最大M子段和
这里讲得很详细了。http://www.cnblogs.com/dongsheng/archive/2013/05/28/3104629.html这题得注意n很大,而m题目中并未告知范围。看discuss里说,m很小不超过100,因此O(n*m)的算法可以过。#include#include#include#include#include#include#includeu原创 2015-04-23 18:58:53 · 402 阅读 · 0 评论 -
hdu 5418 Victor and World (floyd+状压dp)
题目大意:可重复访问顶点的TSP问题。解法:点击打开链接坑点:n=1#include#include#includeusing namespace std;#define maxn 17#define inf 0x3f3f3f3fint Map[maxn][maxn],dp[maxn][1<<maxn|1],n;void floyd(){ for(in原创 2015-08-22 22:33:09 · 2829 阅读 · 9 评论 -
hdu 5375 Gray code (简单DP)
题目大意:给一个含有问号的0-1串,?号可以用0或者1来代替。每个位置有一个分数,将?用0或1替代后得到一个二进制串,将该二进制字串通过转化成格雷码之后,若对应位置上数字为1,则可以得到对应该位置上的分数。问最多能够获得多少分值。分析:1、根据Hint中的提示,可以知道转化后第i个位置为1当且仅当转换前该位置与第i-1个位置的数值不同。2、对于第I个位置,要么是0,要么原创 2015-08-11 20:31:25 · 530 阅读 · 1 评论 -
hdu 5464 Clarke and problem(DP)
题目大意:给n个数,问选择其中若干个数使得和能够被p整除的方案数。设dp[i][j]表示前i个数选取若干个,和被p除余j的方案数。那么dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]%p] (j=0~p-1)坑点:a[i]可以为负数,取模的时候注意一下。#include#include#include#include#inc原创 2015-09-22 20:17:49 · 367 阅读 · 0 评论