-----动规------
文章平均质量分 76
HAI__嗨I起来
IT
展开
-
01背包+记录路径
复习一下#includeusing namespace std;int a[]={0,23,34,113,54,33,65,77,132};int path[110][500];int p[500];int dp[110][500];void solve(int i,int j){ while(i&&j){ //01背包只存在与取与不取两原创 2017-03-15 16:44:36 · 1575 阅读 · 0 评论 -
HDU 5543 Pick The Sticks 背包变形 ccpc
题意:给你一根长为m的两端开口的容器和一些小木棒,每一根小木棒有它的长度和价值,这些小木棒要放入容器中并且每一根小木棒的重心要在容器里面(即可以露出一半的长),问最大价值是多少。dp[i][j][k] 表示前i个小棒放到长度为j的容器里,其中有k个小棒放在边沿部分(k>=0&&k遇到容器存放的题应该毫不犹豫的选择背包模型:#include#include#in原创 2016-05-21 20:59:34 · 302 阅读 · 0 评论 -
HDU 5236 Article 经典概率dp 由一种状态推到另一种状态
题意:DRD经常使用一个文本处理软件,这个软件每输入一个字符就有一定的概率(p)崩溃,并且丢失上次保存之后的所有数据。执行一次保存需要x字符的代价(但是不会崩溃)问在最优策略下,输入字符的期望是多少思路:建立状态dp[i], 表示敲出i个字符的期望次数,那么有 dp[i] = dp[i-1] + p*(1 + dp[i]) + (1-p);解释一下: 敲出i个字符, 首先得敲出原创 2016-05-20 22:11:13 · 262 阅读 · 0 评论 -
HDU 5542 ccpc 树状数组优化dp +离散化
给出长度为n的序列,问这个序列中有多少个长度为m的单调递增子序列。dp[i][j],表示到第i个数字,长度为j的单调递增子序列的个数。需要注意的是取第j个数字思路:通过枚举第i个数字来找出第i个数字前面存在的小于他的dp[k][i-1] 的数量 (i,j的位置不要颠倒了)超时算法:#include #define mod 1000000007 using name原创 2016-05-19 22:41:10 · 334 阅读 · 0 评论 -
SDUT 2169 Sequence dp减枝区间划分
将区间分为m段,使得m段的平方和最小。 我们定义一个Dp数组Dp[i][j]表示以i结尾,分为j段的最小和,那么对于区间[L+1,i],Dp[i][j] = min(Dp[i][j],Dp[L][j-1]+∑k=L+1ia[k])#include#define LL long long#define INF 0x3f3f3f3fusing namespace std;LL d原创 2016-05-19 17:08:54 · 238 阅读 · 0 评论 -
SDUT 2169 Sequence dp减枝区间划分
#include#define LL long long#define INF 0x3f3f3f3fusing namespace std;LL dp[1010][1010];LL sum[1010];int main(){ int T; while(~scanf("%d",&T)) { while(T--) {原创 2016-05-06 17:45:46 · 638 阅读 · 0 评论 -
3307 背包,次优解
aTime Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^题目描述有一个奇怪的超市,超市中有m种商品,每个商品都有一个都价格pi,超市的特殊在于:如果顾客买第i种商品,就会赠送ci个欢乐豆,一种商品对一个顾客只会赠送一次。现在有两个好朋友来超市买东西,他们都带了n元钱,如果最终两个人得到的欢乐豆不一样,他们的欢乐豆的和的最大原创 2015-09-04 21:39:15 · 418 阅读 · 0 评论 -
HDU 1502 三维dp加大数
F[a][b][c]=F[a-1][b][c]+F[a][b-1][c]+F[a][b][c-1];a>=b>=c;package zzz;import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(String args[]){ Sca原创 2016-05-07 09:51:24 · 290 阅读 · 0 评论 -
HDU 3008 dp打怪血量 三重循环调二维背包或一维
点击打开链接题意:人有100血和100魔法,每秒增加 t 魔法(不能超过100)。n个技能,每个技能消耗a[i]魔法值,造成b[i]伤害。普通攻击不消耗魔法,每秒1伤害。boss有100血,每秒对人造成q伤害。每秒内,人先攻击,boss后攻击。问最少多少秒杀死boss?分析:boss对人每秒q伤害,人的死亡时间是确定的,T = 100/q + ( 100%q?1:0 )原创 2016-05-06 21:34:11 · 656 阅读 · 0 评论 -
HDU 1227 dp距离和最小,中位数的应用
在n个商店中建m个仓库,使各个商店到仓库的路程之和最小,商店到哪个仓库是有选择的,总之路程之和要最小!思路:从第i个商店到第j个商店建一个仓库,这个仓库所建的位置一定是dis[(i+j)/2],即建在它的中位数处,所以,这个增加值就是case[i][j]=abs(dis[k]-dis[(i+j)/2])(i我们要把它初始为一个尽可能大的数,要找dp[i][j],原创 2016-05-06 20:35:41 · 884 阅读 · 0 评论 -
HDU 1074 Doing Homework 状态压缩dp
点击打开链接有n门课,每门课有截止时间和完成所需的时间,如果超过规定时间完成,每超过一天就会扣1分,问怎样安排做作业的顺序才能使得所扣的分最小///状态方程为:Dp[next]=min{Dp[next-1<<i]+i的罚时} 枚举i与next///具体实现为: 对每种状态遍历n项任务,如果第i项没有完成,则计算出Dp[next]的最优解#include#原创 2016-04-19 16:22:14 · 223 阅读 · 0 评论 -
HDU 1520 Anniversary party 树形dp 入门
输入n个结点,接下去的n行,表示1-n的每个结点分别具有的活跃值,在接下来去的n-1行,输入a,b,表示b是a的上司输出:由于直接有上司和下属关系的两个人不能同时参加party, 求出能让party活跃值最大的方案(求出最大的活跃值即可).这是一个有向树。每个结点有两种状态,参加和不参加,用0表示不参加,1表示参加dp[i][1]表示第i个参与者参加原创 2016-05-26 20:32:36 · 262 阅读 · 0 评论 -
SDUT 2609 A-Number and B-Number 二分+数位dp
题意是:给出Anum 的定义.为 包含7或者是该数可以被7整除的数。 a[i]=Anum;Bnum的定义是,为Anum的子集但是 如果i为Anum,a[i]对应的值就不是Bnum。即如 A[7] 对应的Anum=35 不是Bnum 所以 B[7] 为37(第7个Bnum数)思路: 先二分一个数mid ,找到,如何求区间内Bnum 的数量呢,,先求Anum的数量,然后对原创 2016-05-26 00:31:31 · 314 阅读 · 0 评论 -
SDUT Mountain Subsequences 2607 dp(字母表优化) 2013年山东acm省赛
点击打开链接题意给n让n个字母,求该串中存在多少个 a1 aj > aj+1 > ... > an的情况思路,枚举最大值,然后dp以s[i]为最大值,从前往后的逐渐增大的序列的个数,这里用到了字母表的优化,由该题得出,此题不可以是n*n的时间复杂度,所以要想到优化,如何优化呢,此时用的了字母本身,将每个字母在当前对应的个数进行保存,然后枚举s[i]的字典序之前的加原创 2016-05-01 22:00:01 · 319 阅读 · 0 评论 -
POJ 2192 Zipper(判断第3个字符串能否有前两个字符串组成) 水dp
方法一:#include #include#include#include#include#include#include#define LL long long#define bug puts("***********")#define INF 0x3f3f3f3fusing namespace std;char s1[1010],s2[1010],s3[1010];原创 2016-05-25 17:41:50 · 602 阅读 · 1 评论 -
HDU 3652 记忆化搜索加 多维数位dp 模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3652题意:问1~n中包含"13"序列且能被13整除的数有多少个。思路: dp[p][m][have][geowei]:p:处理的数位,m:该数对13取模以后的值,have:是否已经包含13 ,gaowei结尾的数尝试用二维数组去写dp[][] 加上各种标记,结果超时了,用四维就不用纠结原创 2016-05-25 00:02:17 · 389 阅读 · 0 评论 -
HDU 2089 数位dp水题 统计区间中不包含62 和 4 的个数
Problem Description杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。不吉利的数字为所有含有4或62的号码。例如:62315 73418 88914都属于不吉利号码。但是,61152虽然含有原创 2016-05-24 22:02:21 · 713 阅读 · 0 评论 -
HDU 4722 Good Numbers 数位dp或找规律枚举 数位dp感悟
数位dp感悟:有一类与数位有关的区间统计问题。这类问题往往具有比较浓厚的数学味道,无法暴力求解,需要在数位上进行递推等操作方法与 基本思想:可以从高到低枚举第一次¨需要统计区间[l,r]的满足题意的数的个数,这往往可以转换成求[0,r]-[0,l)¨对于求区间[0,n)有一个通用的方法。¨对于一个小于n的数,肯定是从高位到低位出现某一位¨预处理f数组。原创 2016-05-24 21:30:04 · 342 阅读 · 0 评论 -
HDU 5242Game 树上的贪心 树形dp 求出使K条链的权值总和最大
树链剖分找权值最大的前k条链题目大意:给定一个树形的游戏网络,可以从根节点出发k个人,每个人可以沿着一条路径走下去,不能回头,出口在各个叶子节点,在路过一个节点时可以 获得该点的权值,每个点的权值只能被获得一次,问k个人怎样走最后可以获得的权值最多解题思路:首先从反向建立一棵有向树(从叶子节点到根节点),首先dfs1找出每个节点到根节点的最大权路径,然后按权值递减排序原创 2016-05-21 22:05:27 · 874 阅读 · 0 评论 -
UVALive 6257 Chemist's vows 判断一个字符串是否由n中的某些字符串组成 dp
#include#include#include#include#includeusing namespace std;string ss[]= {"h","he", "li","be","b","c","n","o","f","ne", "na","mg","al","si","p","s","cl","ar",原创 2016-06-04 00:04:50 · 477 阅读 · 0 评论 -
POJ 3267 The Cow Lexicon DP 字符串匹配 一主串n个子串最少在主串删除多少字母,可以匹配到n 个单词序列中的一些完整单词
POJ 3267 The Cow Lexicon DP 字符串匹配问题扩展/*题意:给一个主串 和n个子串 问最少在主串删除多少字母,可以使其匹配到 n 个单词序列中的一些思路:dp[i] 表示从主串开头的字母到第 i 个字母最少需要删除字符的个数(即主串长度为i时)d[i]=min( d[j]+dele //如果S[j+1..i]子串中包含了一个单词,原创 2016-01-24 16:32:47 · 789 阅读 · 0 评论 -
HDU 5898 数位dp
题意:给出一个区间[l, r],问其中数位中连续的奇数长度为偶数并且连续的偶数长度为奇数的个数。(1例如 12223333 就不满足条件,因为存在奇数个奇数(1个1)#include#define LL long long#define N 100010#define INF 0x3f3f3f3fusing namespace std;LL dp[25][25][25];i原创 2016-09-20 20:59:45 · 1077 阅读 · 0 评论 -
HDU 5900 区间dp
题意:给出n对数keyi,vali表示当前这对数的键值和权值,可以操作将连续的两个数合并,如果满足gcd(a[i],a[i+1])>1,得到的价值是两个数的权值和,每次合并两个数之后,这两个数就会消失,然后旁边的数会接上比如1 2 3 4 合并了 2 3 则 剩下1 4也可以合并。思路:1:处理出任意区间内的所有数是否可以合并对于当前的[l,原创 2016-09-19 12:27:54 · 369 阅读 · 0 评论 -
HDU 5807 分段 dp 将DAG分段进行
给定一个50个点的DAG图每个点有个权值w[i],给定初始3个特工所在的位置是x,y,z这3个城市,每一时刻每个人都得移动到下一个城市,并且要求每一时刻两两之间都能联系但且仅当任意两个城市之间的权值差思路:注意一点是:输入为有向图,并且输入的数据满足 u /*********************** 对于DAG问原创 2016-08-12 20:26:06 · 246 阅读 · 0 评论 -
POJ 2486 Apple Tree 树形dp+背包
题意:给一棵苹果树 ,树上有n个结点,每个结点有 ai个苹果,(不存在父子关系),让求最多走k步之后可以吃到的最多的苹果数目,(走动必须在相邻结点之间进行发生,从一个结点到另一个相邻结点是需要消耗一个步数。),每次都先从结点1开始走。思路:首先看到这个题就要先想起树形结构,然后这道题只存在相邻关系,即是一个无向树,此题让求最多走k步可以吃到的苹果数目,所以状态可以先表示成在原创 2016-09-04 14:20:36 · 414 阅读 · 0 评论 -
POJ 1947 Rebuilding Roads 树形dp+01背包
题意:给了一棵树,树上有n个结点,然后让求最少删去多少条边,可以使剩下的一棵子树中存在p个结点。思路:dp[x][ j ] 表示 把x结点当成根时,形成的恰好含有j个结点的子树,至少删除的边数。此时考虑递推式;对于x结点 的dp[x][j] 他的状态可以由子结点推出来,对于孩子结点son来说;1)当不需要son时 dp[x][j]= dp[x][j]+1;原创 2016-09-04 12:42:25 · 248 阅读 · 0 评论 -
HDU 5877 dfs+离散化+树状数组(树上维护)
题意: 给出一棵n个结点的树和一个数k, 每个节点上有权值, 问有多少个有序对(u,v) (u,v)满足u是v的祖先, a[u] * a[v] 思路:首先这是在树上进行操作,然后就是找满足祖先关系,并且a[u] * a[v] 找点的a[u] * a[v] 然后这就转化成找树上点有多少个小于某个值得问题了,对于这种问题要转换成树状数组进行维护,时间复杂度就变原创 2016-09-12 19:29:29 · 431 阅读 · 0 评论 -
POJ 1185 经典状压dp (模板)
炮兵阵地Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 26096 Accepted: 10072Description司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可原创 2016-09-10 22:18:07 · 416 阅读 · 0 评论 -
HDU 5617 多维dp降维问题,回文串匹配
给你一个n*n的矩阵。 求从(1,1)走到(n,n)所组成的回文串个数。只可以向右或者向下走。思路:1.此题的“序” 是这个二维坐标。2.影响决策的因素是前后字符串是否比配。3.状态及其考虑的方案:因为是回文串问题,所以要考虑从首尾两个位置进行枚举看看相对应的位置是否相等,同时再记录他们的对应位置的相匹配的数量。可以设从起点(1,1)和终点(n,n)同时出发,计算分别到达原创 2016-08-20 10:30:16 · 362 阅读 · 0 评论 -
HDU5616 背包 天平平衡问题
题目大意:有一个只能判断两边是否相等的天平,现在给你一些已知重量的砝码,问你是否可以通过这些砝码测量一个任意给定的重量(input),即可以通过在天平两侧放一定数量的砝码,使天平平衡。#include #define INF 0x3f3f3f3fusing namespace std;const int N=1000;char s[N];int a[N];int dp[N][3*N原创 2016-08-19 19:29:29 · 666 阅读 · 0 评论 -
uva 1218 完美服务器 树形dp 染色问题
详解见紫书 283页。#include#define INF 10000000using namespace std;const int N= 10010;vectorvec[N];int dp[N][3]; ///int vis[N];void dfs(int u){ int len=vec[u].size(); vis[u]=1; dp[u][0]=原创 2016-09-09 21:17:11 · 327 阅读 · 0 评论 -
UVA 1220 树形dp 最大独立集+状态标记
题意:公司里n个人形成一个树形结构,即除了boss之外每个员工都有唯一的直属上司。要求选尽量多的人,但不能同时选择一个人和他的直属上司。问最多能选多少人,以及判断人数最多的前提下得方案是否是唯一结果。思路:树形dp,就是求在树上的最大独立集合,加唯一性特判.首先需要明确的一点是: 这是一个树形结构。A:然后就是要明确 我们要存入两种结果值,一个是最大的独立集合的原创 2016-09-09 18:41:19 · 409 阅读 · 0 评论 -
HDU 5763 Another Meaning dp+kmp优化
点击打开链接给你一个主串一个子串,然后主串中匹配到子串就可以把当前部分改为*,问主串有多少中不同的样子。纯dp做法。统计种类数的话,dp[i]={ 如果后缀串不完全匹配的话:dp[i] = dp[j-1]; 如果后缀串完全匹配的话 dp[i]= dp[i - 1] + dp[i-len2]; }#include#i原创 2016-08-01 11:30:32 · 323 阅读 · 0 评论 -
HDU 5773 The All-purpose Zero 第四场多校赛 LIS变形(最长上升子序列)
点击打开链接题意是:给你一个长度为10W的数组,每个数范围0-100W其中的0可以变为INT范围内的任意值问最长上升子序列的长度思路:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的。因此我们可以把0拿出来,对剩下的做O(nlogn)的LIS,统计结果 的时候再算上0的数量。(因为本来是应该使dp[len原创 2016-08-01 09:40:40 · 273 阅读 · 0 评论 -
HDU 5781 ATM Mechine 多校赛 概率dp
点击打开链接已知ATM机中有最多n元钱,每次可以从ATM机中请求取出任意多的钱,若钱数足够则能成功取出,否则会受到一次警告.如果警告次数超过m次就会被当做小偷抓走.求在保证不能被抓走的前提下,若采取最优策略,期望多少步能够取走所有的钱.题解设当前状态dp[i][j],i为最大钱数,j为剩余报错数, 若i > 0、 j > 0, 则dp[i][j] = minik=1原创 2016-08-03 22:13:48 · 293 阅读 · 0 评论 -
HDU 5723 2016多校赛第一场 最小生成树+记忆化搜索
点击打开链接题目大意:有n(n因为n很大所以用kruskal求最小生成树求出最小花费,然后dfs搜索回溯的办法找到所有情况每条路用过的次数并求出总花费,用总花费除以所有可能发生的次数(n*(n-1)/2)就是我们要求的期望。其中用到vector容器进行dfs;#include#define LL long longconst int NN=1e6+10;using nam原创 2016-07-27 10:54:05 · 338 阅读 · 0 评论 -
ural 1152 搜索或状压
n个阳台,每个阳台上有怪物,第一个阳台跟最后一个相邻,每次攻击其中一个阳台,那么相邻的两个也会被破坏掉,但是你攻击一次,剩下的没有被消灭的怪兽就会攻击你,问消灭所有怪兽 所受伤害值最少是多少#include #include#include#define INF 0x3f3f3f3fusing namespace std;int ans;int n;int a[25];int原创 2016-05-23 22:36:08 · 272 阅读 · 0 评论 -
HDU 1158 Employment Planning dp
点击打开链接///题意 n表示月数每个月都要保证最少有num[i]个人存在并且雇佣一个人解雇一个人需要花钱,并且雇佣了之后还要每个月发工资给他们求实现n个月的人员分配工作最少花费多少钱思路:状态表示: Dp[i][j]为前i个月的留j个人的最优解;Num[i]j>Max{Num[i]}之后无意义,无谓的浪费 记Max_n=Max{Num[i]}; Dp[i原创 2016-04-11 15:18:22 · 303 阅读 · 0 评论 -
HDU 1224 Free DIY Tour 距离的更新 bellman-Ford变形 dp ***
点击打开链接题目大意:给出一些城市的point,从起点出发经过一些城市最终回到起点,在这个过程中经过的下一个城市的point值要求不低于现在城市的point值(最后回到城市1的情况不算),问最后能够达到的最大point值之和,并输出路径。#include#define INF 0x3f3f3f3f#define M 100001using namespace std;i原创 2016-04-13 17:51:02 · 337 阅读 · 0 评论 -
HDU 1501 Zipper 记忆化搜索
点击打开链接题意:给出三个字符串,判断第三个字符串是否是由前两个字符串在本身顺序不变的情况下组成的。思路记忆化搜索。因为存在着两种枚举状态 1.if(s1[x]==s[z]) 2.if(s2[y]==s[z])通过标记数组记录是否已经访问过此遍历途径了来进行,减少时间的消耗///访问过就没必要再访问一遍了,因为路径以前已经走过一原创 2016-04-09 21:43:42 · 279 阅读 · 0 评论