大一暑期集训-梦最初
数论只会GCD
研二在读
展开
-
暑期dp46道(35)--HDOJ 2159 FATE 背包问题
题目链接:hdoj 2159背包问题....直接代码代码:#include#include#include#define debug 0#define M(a) memset(a,0,sizeof(a))#define Max(a,b) ((a>b)?a:b)const int maxn = 100 + 5;int c[maxn], w[max原创 2016-08-13 16:13:42 · 325 阅读 · 0 评论 -
暑期dp46道(23)HDOJ 1059 Dividing 多重背包+二进制优化
题目链接:HDOJ 1059题目大意:有1,2,3,4,5,6这六种marbles的东西,每种都有一定的数量,求是否可以把它们按照一定的组合等分...题解:首先,记录这些的总价值,如果他们的总值不是偶数,一定不能被等分,然后用多重背包加二进制判断它们是否能被等分。代码:#include#include#include#include//sort()原创 2016-08-10 17:21:18 · 445 阅读 · 0 评论 -
暑期dp46道(22)--HDOJ 1158 Employment Planning
题目链接:HDOJ 1158额,这题 直接上代码吧,感觉么啥说的 ,记录下最大员工然后每个月可能的最优解都dp就可以了....(相关细节在代码里注释#include#include#include#include#includeusing namespace std;#define debug 0#define M(a) memset(a,0,sizeof原创 2016-08-10 16:50:16 · 334 阅读 · 0 评论 -
暑期dp46道(15)--HDU 1080 Human Gene Functions DFS+记忆化搜索
题目链接:HDOJ 1080题意就是包含A、C、G、T的两个字符串a,b,可以在任意一个字符串任意位置加空格使得最终两个字符串要等长并且匹配的值要为最优解(两个空格匹配是不允许的)思路:这题最终状态是两个字符串等长且匹配完成,那么我们可以认为这两个字符串的原串中的字符都完成匹配结束,因为空格匹配不允许,当原串中的字符匹配完成,自然就结束了。所以我们可以运原创 2016-08-09 14:17:49 · 546 阅读 · 2 评论 -
暑期dp46道(21)HDOJ 2059 龟兔赛跑
题目链接:HDOJ 2059题意:略,咳咳,大家都看得懂题解:很明显兔子跑完全程的时间很容易就出来了,而且题目数据保证不会出现乌龟和兔子同时到达的情况,所以我们只要求出乌龟跑到终点的最短时间,和兔子的时间对比下就好了。这个全程有n个充电站可以供给乌龟充电,我们可以设有n+2个充电站,第一个在起点,且不需充电的耗时,第二个在终点,对于第i个充电站(1原创 2016-08-10 15:57:24 · 448 阅读 · 0 评论 -
暑期dp46道(20)HDOJ 1081 To the Max 最大连续子序列+暴力枚举
题目链接:HDOJ 1081题意:大致就是给定一个n*n的矩阵,求其中最大的子矩阵和。题解:这题是最大连续子序列的变形,只是把一维拓展到了二维,只要枚举矩阵各列(纵向上的)起点,然后累加从该起点开始的合法长度的值,然后对各行的加和求最大连续子序列和即为当前始末点(横向)纵向矩阵的最优解,记录输出就可。时间复杂度是O(n^3),n最大为100足够的。原创 2016-08-10 15:17:53 · 762 阅读 · 0 评论 -
暑期dp46道(19)HDU 1078 FatMouse and Cheese dfs+记忆化搜索
题目链接:HDOJ 1078题意:给定一个n*n的矩阵,从(1,1)点出发,且每次只能经过比当前点大的点,每次上下左右方向都可以选择但是不能越界,并且每次最大行走距离为m,经过每一点都能获取当前点的值吗,然后累加求最终的最优解。题解:这题用dfs最合适不过了,先用一个数组记录可行方向的单位位移,然后枚举各个方向,先判断各个要走位置(fx,fy)是否合法,并且原创 2016-08-10 14:45:14 · 547 阅读 · 0 评论 -
暑期dp46道(18)--HDOJ 1024 Max Sum Plus Plus
题目链接:HODJ 1024这题花的时间蛮多的,不过没有浪交,就是之前有几位做过的说这题很“巧”,需要费时间,我才没敢轻易交,大概花了一天时间交了一发,A掉,还多开了内存,尴尬,不过确实挺巧的,dp降低复杂度的妙用或许就在这吧;题意:相信大家都能看懂,就是给定一个序列a1,a2.....an;求把它分为m个单独序列的最大值;题解:这题状态方程其实是不难想原创 2016-08-10 14:21:35 · 516 阅读 · 0 评论 -
暑期dp46道(17)--HDOJ1114 Piggy Bank 完全背包
题目链接:HDOJ 1114这题提议很好理解,就是给定coins的weight和不同种类的coins,求组合成这个weight最小的价值,若不能组合,输出"This is impossible.";题解:裸完全背包问题。不过是求装满背包而且要最小,所以还不算太裸;(max->min)dp[0] = 0;其他初始化最大值,判断dp[weight];若为初始原创 2016-08-10 13:39:36 · 402 阅读 · 0 评论 -
暑期dp46道(12)--HDOJ 2191 多重背包+二进制优化
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191关于背包的基础知识详见“背包九讲”....多重背包的的二进制优化:简单地说就是把多重背包转成01背包,同时用二进制的方式优化降低空间和时间复杂度。首先我们知道对于任何一个正整数t都可用t=a0*2^0+a1*2^1+......an*2^n的一组来表示原创 2016-08-03 16:21:46 · 440 阅读 · 0 评论 -
暑期dp46道(24)HDOJ 1074 Doing Homework 状压dp
题目链接:hdoj 1074题意:就是给定一组课程的作业距离现在要上交日期和完成需要的时间,每门课程超过截止日天每一天罚一分,求最小的罚分,并且输出完成顺序(如果存在某些课程完成的先后顺序不影响最终罚分,按照输入出现的顺序输出)题解:这题不是贪心,因为每一门课程的完成都不是独立的,而且他们完成需要的时间各不相同,所以不能用简单的排 序求解。原创 2016-08-10 19:40:29 · 465 阅读 · 0 评论 -
暑期dp46道(25)--HDOJ 1300 Pearls
题目链接:HDOJ 1300题意啊,不再赘述了,只要注意每种都要有额外的10件成交,并且没件需求只能由品质更高的替代才行。。。直接上代码吧,和龟兔赛跑那题差不多,枚举第i种之前已完成最优解状态,中间都用这种品质替代,更新当前最优解。代码:#include#include#include#includeusing namespace s原创 2016-08-10 20:02:25 · 506 阅读 · 0 评论 -
暑期dp46道(26)HDOJ 1501 Zipper dfs+记忆化搜索
题目链接:HDOJ 1501额,这种结题方法讲了很多了,这篇就不细讲了,不过有点要做改动,就是,dfs到达第三个字符串结尾就一直退出就可以了,全局变量标记状态,或者用int dfs(int x,int y,int k){ if(k == strlen(str3)) { return 1; } int ans = 0; if(vis[x][y]) { ret原创 2016-08-11 13:29:10 · 384 阅读 · 0 评论 -
暑期dp46道(34)--HDOJ 1203 01背包
题目链接:HDOJ 1203题解:01背包问题,注意至少拿到一个offer的概率 b:一个offer拿不到的概率a,则b=1-a;所以dp[j] = Max(dp[j], 1-(1- dp[j - c[i]])*(1 - w[i]));代码:#include#include#include#define debug 0#define M(a) m原创 2016-08-13 16:05:54 · 432 阅读 · 0 评论 -
暑期dp46道(33)--HDOJ 1176 免费馅饼 类树塔:
题目链接:HDOJ 1176树塔问题,data[i][j]表示i时刻,j+1位置能接到最大馅饼数;代码:#include#include#include#define debug 0#define M(a) memset(a,0,sizeof(a))#define Max(a,b) ((a>b)?a:b)const int maxn原创 2016-08-13 15:59:40 · 381 阅读 · 0 评论 -
暑期dp46道(32)--hdoj 1171 Big Event in HDU 多重背包:
题目链接:hdoj 1171多重背包问题,由于数据量较小,所以可以不用二进制优化。代码:#include#include#include#include#includeusing namespace std;#define M(a) memset(a,0,sizeof(a))#define Max(a,b) ((a>b)?a:b)#def原创 2016-08-13 15:50:16 · 401 阅读 · 0 评论 -
暑期dp46道(31)--HDOJ 1087 最大上升子序列和 dp(水)
题目链接:HDOJ 1087裸题,直接上代码:#include#include#include#include#includeusing namespace std;#define M(a) memset(a,0,sizeof(a))#define Max(a,b) ((a>b)?a:b)#define Min(a,b) ((a<原创 2016-08-13 15:41:15 · 358 阅读 · 0 评论 -
暑期dp46道(30) HDOJ 1227 Fast Food
题目链接:hdoj 1227题意:给定n个快餐店的位置,要在其中m个位置建商店,使得n餐厅到离自己最近的商店 距离的和最小,求这个最优解;题解:首先对i和j之间所有餐厅来说,建一个商店的最优解,就是把它的位置定在a[(i+j)/2],这时sum(i,j)=abs(a[k]-a[(i+j)/2])(k>=i&&k所以可以枚举之前的子状态原创 2016-08-11 17:08:30 · 478 阅读 · 0 评论 -
暑期dp46道(13)——HDOJ 1160FatMouse's Speed 排序+最长严格下降子序列+回溯
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160题意:给定一组mice的体重w和速度s,输入以EOF结尾,求出任意一组w严格上升,s严格下降的mice序列的长度以及按顺序的下标分析:这题如果先把所有mice的w按升序排列,就变成了求s严格下降的最长子序列,并回溯输出下标这里用结构体记录数据并排序。原创 2016-08-04 10:55:26 · 530 阅读 · 0 评论 -
暑期dp46道(29) HDOJ 1503 Advanced Fruits 最长公共子序列
题目链接:HDOJ 1503题意:给定两个字符串,输出任意一个满足条件的字符串;条件,给定的两个字串都是该字符串的子序列且该字串的长度最短。题解:这题很容易推出待求字串的长度和两串的最长公共子序列有关,公共部分输出一次,两字符串各私有的各个输出;而私有不私有在求解最长公共子序列的时候,每个子问题都可以得出;例如两个字符串str1和str2,d原创 2016-08-11 15:22:48 · 525 阅读 · 0 评论 -
暑期dp46道(28) hdoj 1502 Regular Words dp+高精度额
题目链接:HDOJ 1502题意:长为3*n的字符串有A、B、C三种字符,且对于它的任意前缀都满足num(A)>=num(B)>=num(C),且整体的 num(A)=num(B)=num(C)=n,求对于n(60>=n>=0)有多少种不同的构成串的方式。 教训,刷这题的当天我做了好几道dfs+记忆化搜索题,恰巧这题用这个思想貌似也能做,所以顺利写原创 2016-08-11 14:49:53 · 424 阅读 · 0 评论 -
暑期dp46道(27)--HDOJ 3008 Warcraft
题目链接:HDOJ 3008题意:如果我没看错,应该是魔兽吧,表示没玩过嘿嘿,意思就是初始满的魔法值,己方和魔兽生命值都是100,每秒 钟对魔兽可以采取普攻(平A)造成1点伤害,也可以使用当前魔法值可以释放的任一技能,造成技能伤害,每次攻击过后可以恢复最多t的魔法值,但是上限为100,魔兽每秒对你造成固定伤害,你首先发起进攻,求最终谁会先game over,若是你原创 2016-08-11 14:16:56 · 392 阅读 · 0 评论 -
暑期dp46道(16)hdoj 1025 Constructing Roads In JGShining's Kingdom最长上升子序列(二分)
题目链接:hdu 1025题意:这题很容易想到最长上升子序列的模型,但是高高兴兴写出来也会TLE。。懵逼 不过也是,看这个复杂度500000,o(n^2)铁定挂啊,所以就需要优化,二分法就可以。话不多说,上模板:void Do(){ dp[1]=data[1]; int r,l,len=1; for(int i=2原创 2016-08-09 14:43:02 · 430 阅读 · 0 评论 -
暑期dp46道(14)--HDU 1224 Free DIY Tour类树塔问题+回溯输出
题目链接:HDOJ 1224 Free DIY Tour题意:大致就是在一个图上有n个城市的点,各点都有相应的兴趣值,规定旅途只能从标号为1的点出发,然后到n+1(其实就是出发点)结束; 然后在这张图上只存在标号从低到高的航班,让你求最大的兴趣值和路径。思路:(1)和数塔很像了,只不过这里有航班的限制输入时用一个数组标记vis[][]是否可行就可; (2原创 2016-08-09 13:23:54 · 430 阅读 · 0 评论 -
暑期dp46道(38)--HDOJ 2845 Beans 最大不连续子序列和
题目链接:HDOJ 2845刚开始有点迷,后来发现这就是最大不连续子序列和的二维变形.......因为选定一个点, 和他同行相邻的点不能选定,且和它列数相邻的也不可选,全局考虑下,就是先求一维的最大不连续序列和,然后 再对所求序列和组成序列求和。。。结束代码:#include#include#include#include#inclu原创 2016-08-16 16:40:59 · 545 阅读 · 0 评论 -
暑期dp46道(37) HDOJ 2844 COINS
题目链接:HDOJ 2844多重背包,不过没用模板 省事写了二进制代码:#include#include#include#define debug 1#define M(a) memset(a, 0, sizeof(a))const int maxn = 100000 + 5;int n, m, f[100005], s[maxn], c[max原创 2016-08-16 16:30:59 · 385 阅读 · 0 评论 -
暑期dp46道(36)--HDOJ 2577
题目链接:HDOJ 2577题意:打出所给的字符串,大小写都有,并且最终Caps Lock 要关闭,求最少的按键数题解:简单的dp方程,考虑Caps Lock on 和in的情况dp就可代码:#include#include#include#include#includeusing namespace std;#define M(原创 2016-08-16 15:03:16 · 375 阅读 · 0 评论 -
暑期dp46道(4)
HDOJ2571命运 链接 http://acm.hdu.edu.cn/showproblem.php?pid=2571状态转移方程:dp[i][j]+=max(max(dp[i][j+1],dp[i+1][j]),dp[i][j*k](PS:k>2))注意方程中下标都要合法,满足条件自下而上搜索就可然后输出dp[1][1];代码:#include#include原创 2016-07-21 14:49:17 · 528 阅读 · 0 评论 -
暑期dp46道(7)--HDOJ1846 Brave Game
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1846解题思路:首先对于m+1个石头先走的一方无论怎么选择,后走的一方都能在这一轮清空所有石子获得胜利,所以如果某一方首先把剩余的石子数目控制为(m+1)*i(i>=1),他就能获得胜利,所以这是个求余判断问题,嘿嘿。(有时间可以套路套路。。。)处理:若果n本原创 2016-08-01 19:36:06 · 433 阅读 · 0 评论 -
暑期dp46道(11)——HDOJ 1422重温世界杯 dp+记忆化搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1422解题思路:这题刚开始用的暴力(一)首先第i个城市的裸剩余费用:data[i]=a-b(可能为0或负)(二)然后按照游览方向递推直到当前所在城市的裸费用不足0记录之前已浏览的城市数目,(三)枚举i:1->n求最大值不出预料:TLE所以就想到了 昨天一道原创 2016-08-03 14:56:20 · 493 阅读 · 0 评论 -
暑期集训-dp46(3)数塔问题
HDOJ 2084数塔经典dp,从数塔的底部向上处理,上层的变化值为左右状态子问题的解和0的最大值,最后,输出数塔顶点的值即可。状态转移方程:data[i][j]+=max(0,max(data[i+1][j],data[i+1][j+1]));代码:#include#include#include#include#include#include#inclu原创 2016-07-15 20:57:15 · 554 阅读 · 0 评论 -
暑期-dp46道(2)
杭电oj1231最大连续子序列题解链接:http://acm.hdu.edu.cn/viewcode.php?rid=17563639和系列(1)基本没差,就是加了个全为负数时的情况,判断下就好了代码:#include#include#include#include#include#include#include#include#includeusin原创 2016-07-15 19:59:10 · 426 阅读 · 0 评论 -
暑期集训-dp(1)
HDU 1003 MAX SUM 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003这是早前就训练过的题,所以没什么难度。列出状态转移方程,用ans[i]记录以data[i]为子列终点的最大值;ans[i]+=(ans[i-1]>0)?ans[i-1]:0;dp水题,只要在找出MAX_SUM后找出始末下标就可,注意输出格式。原创 2016-07-15 20:31:00 · 566 阅读 · 1 评论 -
暑期dp46道(6)抢劫Robberies ——HDOJ 2955
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955(01背包)思路:刚开始想裸背包,求在安全概率内的最大金钱数,但是这题的浮点位数不能确定,而且概率不是相加的,所以就应该反过来想,求获得i金钱的最大安全概率,然后枚举,记录满足条件的最大i值.w[i]表示第i个银行能抢到的金额,c[i]表示在第i个银行抢劫的安全概率(各银行间相互独立)原创 2016-08-01 19:16:44 · 450 阅读 · 0 评论 -
暑期dp46道(8)--HDOJ 1506 Largest Rectangle in a Histogram
题目链接:http://acm.hdu.edu.cn/viewcode.php?rid=17848610这题可以看成是二维矩阵求最大子矩阵限定在某一行的情况。最大子矩阵求法:用h[i][j]、r[i][j]和l[i][j]分别表示(i,j)点向上、向右和向左方向上的最大延伸(h[i][j]其实可以看做该点最大矩阵的高,r[i][j]和l[i][j]只是表示可以在原创 2016-08-01 20:13:15 · 405 阅读 · 0 评论 -
暑期dp46道(10)HDOJ 2602 Bone Collect 01背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602额没啥说的,裸01背包状态转移方程:二维:ans[j][v]=max(ans[j-1][v],ans[j-1][v-c[i]]+w[i])优化空间复杂度后:ans[j]=max(ans[j],ans[j-c[i]]+w[j])关于背包的讲解我转个链接吧,ht原创 2016-08-02 21:10:02 · 353 阅读 · 0 评论 -
暑期dp46道(46)--HDOJ 1069
题目链接:HDOJ 1069算水题了,重点就是 把n种block细分成3n种;AC CODE:#include#include#include#include#include#includeusing namespace std;#define debug 0#define M(a) memset(a,0,siz原创 2016-08-19 18:08:47 · 374 阅读 · 0 评论 -
暑期dp46道(45)--HDOJ 1257 最少拦截系统 最长递增子序列
题目链接:hdoj 1257AC CODE:#include#include#include#define debug 0#define M(a) memset(a,0,sizeof(a))#define Max(a,b) ((a>b)?a:b)#define REP(o) for(int i=1;i<=o;i++)const int maxn =原创 2016-08-19 16:43:41 · 406 阅读 · 0 评论 -
暑期dp46道(44)--HDOJ 1058
题目链接:HDOJ 1058代码:(注意输出细节#include#include#include#define debug 0#define M(a) memset(a,0,sizeof(a))#define Max(a,b) ((a>b)?a:b)#define REP(o) for(int i=1;i<=o;i++)__int64 ans[原创 2016-08-19 16:37:16 · 379 阅读 · 0 评论 -
暑期dp46道(43)--HDOJ 1159 最长公共子序列(可不连续)
题目链接:HDOJ 1159简单dp,裸题,直接上代码:#include#include#include#define debug 0#define M(a) memset(a,0,sizeof(a))#define Max(a,b) ((a>b)?a:b)const int maxn = 1000 + 5;int dp[maxn][maxn];ch原创 2016-08-18 20:27:26 · 400 阅读 · 0 评论