dp
hadis_fukan
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #293 (Div.2) 小记
A.过pre,然后被hack了。而且到最后都没改过来- -题意:给出两个串,s和t,保证字典序sstr和s、t长度相同。思路:从后面开始找到第一个不是'z'的字母,将其换成字母表中后一个字母。再把找到字母后面的字母全部换成'a'。如果此时构造出的字符串不满足#include#include#include#include#include#inc原创 2015-02-25 10:36:30 · 534 阅读 · 0 评论 -
hdu 1203 I NEED A OFFER!
01背包的变形,算概率都变成乘法运算。初始化为1。题目是要问至少获得一个offer的概率,那么你可以反过来求一个都拿不到的概率,再用1减去这个概率就是题目要的答案,这样可以简化问题。#include#include#include#includeusing namespace std;int v[10005];double dp[10005],w[10005];原创 2014-01-20 12:15:01 · 875 阅读 · 0 评论 -
hdu 1074 Doing Homework (状压dp+搜索)
算法核心:状态压缩DP大意:有n门课程作业,每门作业的截止时间为D,需要花费的时间为C,若作业不能按时完成,每超期1天扣1分。这n门作业按课程的字典序先后输入问完成这n门作业至少要扣多少分,并输出扣分最少的做作业顺序PS:达到扣分最少的方案有多种,请输出字典序最小的那一组方案分析:n用一个二进制数存储这n份作业的完成情况,第1.。。。n个作业状况分别对应二进制数原创 2014-01-20 08:44:52 · 933 阅读 · 0 评论 -
poj 1742 && hdu 2844 Coins
多重背包的可行性问题。可以根据《背包九讲》的多重背包模板稍加修改procedureMultiplePack(cost,weight,amount) if cost*amount>=V CompletePack(cost,weight) return integer k=1 while k ZeroOne原创 2014-01-19 20:54:06 · 1011 阅读 · 0 评论 -
hdu 2870 Largest Submatrix
题意略。是hdu 1505 的变形,先将所有能变的都变,得到一个没有w、x、y、z的矩阵。然后就是重复1505的做法了,求三次,取最大值。#include#include#includeusing namespace std;char mp[1005][1005];char w[1005][1005];int t[1005][1005];int le[1005]原创 2014-01-19 10:25:04 · 957 阅读 · 0 评论 -
zoj 1149 && hdu 1059 && poj 1014 Dividing
多重背包转化为01背包。学习了二进制在背包问题中的应用。。。爽!!!!!#include#include#includeusing namespace std;int a[8];int bag[120005];int v[120005],cc,sum;void DP(){ int i,j; memset(bag,0,sizeof(bag));原创 2014-01-19 16:08:17 · 1125 阅读 · 0 评论 -
hdu 1087 Super Jumping! Jumping! Jumping! ----dp
题意:找所有上升子序列和中的最大值。思路:统计以a[i]为上升子序列的最后一个值时,向前找上一个满足的最大累加和。写法就很多了。。#include#include#includeusing namespace std;int a[1005],dp[1005];int main(){ int n,ans; while(scanf("%d",&n)&原创 2014-01-18 23:12:29 · 647 阅读 · 0 评论 -
hdu 1505 City Game && hdu 1506 Largest Rectangle in a Histogram
之所以把这两题放一块呢。。。是因为1505 是1506的深化!1506是求最大矩形覆盖(说到这里,我觉得好多覆盖问题都是用dp解决的啊,有树上的最少覆盖条件:昨天做的那个 POJ 1463 && HDU 1054 Strategic Game (树形DP)有线性问题的覆盖,比如这两题)hdu 1506 和那个POJ 2796 Feel Good应该就原创 2014-01-19 09:39:42 · 1083 阅读 · 0 评论 -
hdu 4405 Aeroplane chess (期望dp)
分析:dp[i]表示走到第i(0....n)个grid时所走的步数。根据 简述期望问题的解法来推就行了。#include#include#includeusing namespace std;int hash[100010];double dp[100010];int main(){ int n,m,x,y; while(scanf("%d%原创 2014-01-29 13:45:26 · 994 阅读 · 0 评论 -
poj 1837 Balance (01背包)
题意:有一个两臂长15的天平上有n个钩子,现在有g个不同质量砝码。用上所有的砝码使天平平衡有多少种方法。分析:关键在于怎么样选择状态才好表示状态转移。dp[i+w[i]*pos[k]]][j]表示用了i个砝码达到平衡度为j有多少种方法。dp[i+w[i]*pos[k]][j]=sum(dp[i-1][j]) 由于距离c[i]的范围是-15~15,钩码重原创 2014-01-28 19:32:54 · 942 阅读 · 0 评论 -
hdu 2830 Matrix Swapping II
题意:可以任意交换两行,求01矩阵中最大的全1矩阵。还是和hdu 1505一样的处理方法。统计的时候学到了一招,我自己想到的是o(N^3)的统计方法,就是只要不小于当前位置的就tmp++。然后a[i]*tmp,在所有结果中找最大值ans。这里用到了一个小技巧,就像那个开0-10000的数组作计数器,找n个集合的交集的那题一样。 zoj 1143 && poj 1原创 2014-01-19 11:38:02 · 824 阅读 · 0 评论 -
hdu 1003 Max Sum (求最大子序列和)
以前写过,不过今天的刚开始的写法怎么也过不了。。。。后来换了种写法重写= =就行了,原因未知。。。我好伤心啊= =以前发的题解:点击打开链接换写法后的代码:#include#includeusing namespace std;int main(){ int T,n,ans,sum,s,e,a,cas,i,tmp; scanf("%d",&T);原创 2014-01-18 16:23:29 · 678 阅读 · 0 评论 -
POJ 1463 && HDU 1054 Strategic Game (树形DP)
每个节点上可以站士兵守卫道路。问要守卫所有的道路至少要多少个士兵。跟那个 poj 2342 Anniversary party(简单树形dp+dfs)真是像极了。。。原创 2014-01-18 14:59:13 · 1188 阅读 · 0 评论 -
POJ 2184 Cow Exhibition (体积为负时01背包的处理+问题转化)
题意:有很多牛,每只牛有一个智商和幽默度,要选出一些牛,智商加幽默度总和最大,其中智商总和和幽默度总和都不能是负数。mark:变种的01背包,可以把智商看成体积,幽默度看成价值,那么就转换成求体积和价值都为正值的最大值的01背包了。 由于有负数,所以可以每个体积+1000,然后开一个数组记录用该体积得到最大值时用了多少个1000.dp方程:ans=max(dp[j]+j原创 2014-01-20 15:25:30 · 1038 阅读 · 0 评论 -
Light oj 1064 Throwing Dice (概率dp)
题意:给定n个骰子和一个x,要求出用这些骰子投出大于等于x的概率。要求最简。分析:先预处理算出i个骰子得到的和为j的种数。然后用gcd函数约分。dp[i+1][j+k]=sigma(dp[i][j]) (1AC代码1:#include#include#includetypedef unsigned long long ull;using namespace std原创 2014-01-29 20:56:19 · 1299 阅读 · 0 评论 -
hdu 3681 Prison Break (状态压缩dp/dfs + bfs)
题意:一幅矩阵迷宫,給起点,开始时充满电,要求是遍历给定的点,每移动一次花费1,迷宫中有若干充电池可充满电(每个充电池只能用一次),求原始电量最少是多少。分析:1、由于所有'Y'处一定要走到,‘G'可以走也可以不走,且他们的总个数最多只有15个。the sum of energy pools and power switches is less than 15.因此原创 2014-02-06 16:21:11 · 1185 阅读 · 0 评论 -
E - 1sting (递推+大数加法)
根据题意递推构造类fibnacci数列,由于要算到第200项,已经远远超出long long 所能表示的范围。要用大数加法。即用数组模拟。DescriptionYou will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ‘2’, or leave原创 2015-01-18 09:35:38 · 735 阅读 · 0 评论 -
hdu 4901 The Romantic Hero (dp+背包问题)
题意:有n个数,从n个数中选出两个集合s和集合t,保证原序列中,集合s中的元素都在集合t中元素的左边。且要求集合s中元素做抑或运算的值与集合t中元素做与运算的值相等。问能选出多少种这样的集合s和t。算法:左右dp。用dp[i][j]表示前i个数 做抑或运算得到j的方法数。最后一个值取不取到都不一定。故为背包的问题。右边也是一样。枚举时可能出现重复。枚举到第i原创 2014-08-03 16:57:59 · 776 阅读 · 0 评论 -
hdu 4906 Our happy ending (状态压缩dp)
题意: 有n个数,每个数x 满足0求能构造出这样的数列的个数。原创 2014-08-02 22:01:04 · 603 阅读 · 0 评论 -
poj 3635 Full Tank? ( 图上dp )
题意:已知每个点的加油站的油价单价(即点权),每条路的长度(边权)。有q个询问,每个询问包括起点s、终点e和油箱容量。问从起点走到终点的最小花费。如果不可达输出impossible,否则输出最小的旅途费用。算法:其实要分析状态= =感觉就像是dp。最直接的想法是 每到一个点都加上要走到下一个点所需要的油量。但是走的路不同,到底怎么处理加多少的问题呢?因原创 2014-07-10 23:20:22 · 1182 阅读 · 0 评论 -
zoj 3527 Shinryaku! Kero Musume (树形dp---带尾巴的环的处理)
题意:n个点,每个点有一个faith值,然后有一个关联的点。如果在i点和它的关联点pi同时修神庙则得到的faith值变为fi+gi,如果只在i点修不在pi修建,则得到的faith值为fi。问最优修建方案中能获得的faith值即求能获得的最大faith值。算法:由于有n个点和n条边,所以一定是一个带环的图,环外有小尾巴。对于环外的点,利用dp[i][0]+=max(dp[原创 2014-02-16 19:47:01 · 1475 阅读 · 0 评论 -
poj 1947 Rebuilding Roads (树形dp)
给一棵树,问最少减掉几条边能得到一棵p个节点的树。算法:dp[i][j]表示以i为根的子树要变成有j个节点的状态需要减掉的边数。考虑状态转移的时候不考虑i的父亲节点,就当不存在。最后统计最少减去边数的时候+1。 考虑一个节点时,有两种选择,要么剪掉跟子节点相连的边,则dp[i][j] = dp[i][j]+1; 要么不剪掉,则d[i][j] = max(原创 2014-02-13 19:49:16 · 914 阅读 · 0 评论 -
hdu 4336 Card Collector (期望dp|容斥原理)
题意:每包里面最多只有一张卡片(可能没有),要集齐n张不同的卡片(1问集齐n张卡片要买的包数期望。算法:1、期望公式:E=sum(xi*pi)。等于某一件事件的状态*它发生的概率。在高中课本里就是列个分布列然后求期望。 我们用二进制枚举卡片表示各个状态。1表示已经集齐,0表示还没有。从末态倒推到起始状态。 这里我们看每个状态是可能由哪原创 2014-02-12 12:05:52 · 1669 阅读 · 0 评论 -
poj 2411 && zoj 1100 Mondriaan's Dream ———状态压缩dp
题目链接:http://poj.org/problem?id=2411题意:用1*2的骨牌填充一个n*m的网格。求方案数。分析:联系用二进制枚举子集的方法下面这个语句可以不重不漏的枚举出S的所有子集for(int mask1=mask; mask1>=0; mask1=(mask1-1)&mask)这道题与以上的情原创 2014-02-11 19:12:53 · 1286 阅读 · 0 评论 -
hdu 3001 Travelling (状态压缩dp-----模拟三进制)
每个点最多走两次的tsp用三进制记录每个点到的次数。dp方程:dp[i][j]=min(dp[i][j],dp[i-bit[j]][k]+mp[k][j]) 【i中bit[j]不为0---i状态中j点去过 且mp[k][j]!=0】(上面为2进制表示的最短路径dp的变形:dp[i][j]=min(dp[i][j],dp[i&(~(1【i&(1dp[i][j]表原创 2014-02-09 12:06:36 · 1004 阅读 · 0 评论 -
poj 3181 Dollar Dayz (完全背包+高精度)
题意:求将n分解为大于等于1小于等于k的数,有多少种分法。(划分数问题)分析:1、可以用完全背包解。for(i=1...k) for(j=i...n) dp[j]+=dp[j-i];由于1故用两个long long 来表示。2、可以用划分数的思想。dp[n][m]表示把n分为若干份,且最大的那份1、当m=1,n=1时,dp[n原创 2014-02-09 11:06:38 · 1040 阅读 · 0 评论 -
fzu 2113 Jason的特殊爱好 && hdu 2089 不要62 ( 数位dp )
fzu 2113#include#include#includeusing namespace std;__int64 dp[20][20],num[20];__int64 dfs(int pos,int n,bool flag){ if(pos<0) return n; if(!flag && dp[pos][n]!=-1) return dp[po原创 2014-02-10 14:49:35 · 1047 阅读 · 0 评论 -
poj 1155 TELE (树形dp)
题意:有一个电视台广播节目,广播的网络用一棵树表示,节点1表示电台,叶子结点表示用户,用户愿意付一定的钱去收看这个节目,从非叶子结点到其他结点需要一定的费用(即从中继点到另一个中继点需要一些钱),问最后在不亏本的情况下,最多能使多少人收看到节目。分析:1、定义dp[i][j]表示在节点i为根节点的子树下,有j个人收看节点的最大利润。状原创 2014-02-02 22:49:17 · 996 阅读 · 0 评论 -
POJ 2479 Maximum sum (求2个不相交的连续字段和的最大值)
题意如标题分析: 给定某一数组s1,s2,s3,...,sn,求一连续si,s(i+1),s(i+2),...,sj使其和最大. 这个问题有一个简单的DP思路,先把状态转移方程写出:sum[n]=max{sum[n-1],0}+s[n].此状态方程用语言描述:在求sum[n]时,若前n-1个数中所求得的连续和最大值都小于0时,则把前n-1个数抛弃,从第n个数原创 2014-01-18 09:32:11 · 1559 阅读 · 0 评论 -
hdu 2571 命运 (记忆化搜索+dp)
题意:n行m列的矩阵,每个格子对应一个幸运值,从(1,1)走到(n,m),问能得到的最大幸运值。分析:从最后一步向前递推(即从(n,m)往前累加幸运值),利用dp[i][j]记录(i,j)处能得到的最大幸运值,避免重复计算。只需一直更新到(1,1)就可以了。#include#include#include#define INF 0x3f3f3f3fusi原创 2014-01-26 18:48:27 · 1085 阅读 · 0 评论 -
hdu 1069 Monkey and Banana
题意:有n个长方体盒子,要把他垒成梯子,垒起来的时候可以翻转。已知每个盒子的长宽高,盒子a能垒在盒子b上的要求是盒子a底面的两条边小于盒子b底面的两条边。问最多能垒多高。分析:由于可以翻转,则对应了3*n种盒子。按照得到的3*n中盒子的长宽排序。先按长递减排序,长相等的按宽递减排序。枚举每个盒子,分别向前递推能够放在当前盒子下的最大高度。然后更新当前盒子原创 2014-01-26 18:56:52 · 1077 阅读 · 0 评论 -
hdu 4539 郑厂长系列故事——排兵布阵 (状态压缩dp)
跟poj 1185 炮兵阵地差不多。此题由于士兵不能安排在曼哈顿距离为2的地方。所以只要不是类似:第i-2行: 010 010第i-1行: 000 100 001第i行: 010 010 1】同一列隔一行的位置都有士兵。原创 2014-01-23 20:04:56 · 1142 阅读 · 0 评论 -
背包问题
poj 3624 Charm Bracelet (01背包 水题)#include#include#includeusing namespace std;int dp[1600005];int v[3500],w[3500];int max(int a,int b){ return a>b?a:b;}int main(){ int n,vv;原创 2014-01-22 20:40:00 · 870 阅读 · 0 评论 -
hdu 1080 Human Gene Functions (LCS的变形)
题意:有一个基因配对表,基因序列任意位置可插入空位‘-’使两段基因序列相等,求按最佳方案插入空位后得到的 两段基因序列的最大匹配值。分析:类似于最长公共子序列。dp方程:dp[i][j]=max(dp[i-1][j-1]+solve(s1[i],s2[j]),dp[i-1][j]+solve(s1[i],'-'),dp[i][j-1]+solve('-',s2[j原创 2014-01-22 22:27:50 · 787 阅读 · 0 评论 -
hdu 3033 I love sneakers! (多组背包变形-----每组至少选一个)
题意:有n种品牌的鞋子啊,每种品牌又分几类不同的鞋子。已知每双鞋子的标价和实际的价值。 要求每种品牌至少买一类鞋子。问花m钱能买的鞋子的最大价值。如果不能满足每种品牌至少 买一双鞋子(就是钱不够用啦)就输出不可能。分析:《背包九讲》中的分组背包是每组最多选一个。而这题是每组要至少选一个。dp[i][k-v[j]]+w[j]表示不是第一次在本组中选鞋子原创 2014-01-22 08:59:00 · 978 阅读 · 0 评论 -
hdu 1158 Employment Planning
题意:一个项目需要n个月完成,hire一个人所需的费用、每个人一个月的工资、fire一个人所需的费用。以及每个月至少要雇佣xi个人。求完成项目所需要的最少投入资金。分析:状态转移方程:dp[i][j]=min(dp[i-1][k]+j*s+k>l?(k-j)*fire:(j-k)*hire) p[i-1]dp[i][j]表示到i月为止,第i月雇佣j个人所需要的原创 2014-01-21 19:53:48 · 857 阅读 · 0 评论 -
hdu 2845 Beans
题意:每个格子有一颗豆子,有相应的价值。一个人拿了(x,y)处的豆子就不能拿左右相邻格子的豆子(即不能拿(x,y-1)和(x,y+1)处的豆子),也不能拿上下两行的豆子。问这个人最多能获得多大的价值。分析:先把每一行单独拿出来考虑,这一行最多能获得多大的价值呢?b[i][0]=max(b[i-1][0],b[i-1][1]);b[i][1]=b[i-1][0]+a[原创 2014-01-22 14:28:25 · 849 阅读 · 0 评论 -
hdu 1024 Max Sum Plus Plus (求一个序列中选出的m个不相交子段和的最大值)
这题真的好难理解好难实现啊。。。。原创 2014-01-22 13:46:31 · 1253 阅读 · 0 评论 -
hdu 1025 Constructing Roads In JGShining's Kingdom (LIS)
题意:国王修路问题。道路不能交叉,问最多能修多少条路。分析:把对应的匹配位置记下来,然后找位置坐标的LIS。跟那题把LCS转化为LIS一样的思路 uva 10635 Prince and Princess (将LCS 转化为 LIS)只不过是那题找的是同一个数在另一序列出现的位置,这题找的是和当前数匹配的数在另一序列中的位置。二分原创 2014-01-22 10:07:06 · 770 阅读 · 0 评论 -
hdu 1978 How many ways (记忆化搜索+dp)
题目是中文,就不啰嗦了。。。#include#include#include#includeusing namespace std;int dp[110][110],mp[110][110];int n,m;int dfs(int x,int y){ int k=mp[x][y]; int i,j; if(x==m && y==n)原创 2014-01-21 20:44:00 · 837 阅读 · 0 评论