随笔分类 -  动态规划

摘要:题意:有两个物品,两个物品连续放分别最多放a,b个,输出总共放n个的方案数 分析:考虑dp[n][p],表示最后放p,总共放n个方案数,就很简单了 也可以这样定义状态dp[n][k][l],表示总共n个,最后面连续放k个l的方案数 阅读全文
posted @ 2017-04-30 19:46 N维解析几何 阅读(352) 评论(0) 推荐(0)
摘要:#include using namespace std; typedef long long ll; const int maxn=1>t; while(t--){ memset(dp,0,sizeof(dp)); dp[0][0]=1; cin>>n>>m; int p=1; for(int i=1;i... 阅读全文
posted @ 2017-04-28 20:51 N维解析几何 阅读(133) 评论(0) 推荐(0)
摘要:有一台神奇的打印机,可打印的字母范围大写A-Z,每次只能从纸带上的任意位置开始打印同一字母任意次数,并且可以覆盖之前同一位置上已经打印上的字母。给定一个目标字符串,问最少需要打印多少次才能打印出给定字符串。例如,目标为ABCBA,先打印AAAAA,再打印BBB,再打印C,所以答案为3。 分析:没什么 阅读全文
posted @ 2017-03-21 11:02 N维解析几何 阅读(621) 评论(0) 推荐(0)
摘要:题意:给出存钱罐空和满的时候的重量,然后给出n种钱币,计算存钱罐满的时候存钱罐内最少有多少枚钱币 分析:完全背包问题,恰好装满,只要把dp[0]设为0,其他的设为INF(表示一个不可能达到的数,注意取得数不要再+-中超过精度) 这样就能保证值不为INF的都能找到一条从0到i的路径 #include< 阅读全文
posted @ 2017-03-15 15:23 N维解析几何 阅读(107) 评论(0) 推荐(0)
摘要:题意:给n个数,输出最大上升子序列的和 分析:类似最长上升子序列,dp[i]表示选i的时候最大的上升子序列和 那么 dp[i]=a[i]; for(int j=0;j<i;j++) if(a[j]<a[i]&&dp[j]+a[i]>dp[i]) dp[i]=dp[j]+a[i]; 复杂度O(n^2) 阅读全文
posted @ 2017-03-15 15:14 N维解析几何 阅读(141) 评论(0) 推荐(0)
摘要:题意:小明有n门课,每门课都给出了名字 截止时间 做完需要时间 如果到期没有做完,那么每天每门课要扣除一分,只有昨晚一门课才能去做另一门课 输出扣除分的最小值,并且输出序号字典序最小的那组做作业顺序 分析:只有15门课,可以想到用二进制表示每门课是否做完,那么接下来枚举每个状态就好了 输出方案的话, 阅读全文
posted @ 2017-03-15 14:59 N维解析几何 阅读(87) 评论(0) 推荐(0)
摘要:题意:给出多种a*b*c的箱子,每种箱子有多个每个箱子底面如果长和宽均小于另一个箱子的低面,那么这个箱子那么可以放在那个箱子上面 请输出箱子能够排列的最大的高度 分析:一种箱子最多有6种有效状态,那么把每个箱子拆分为6个箱子,(a,b,c)分别表示长宽高 那么比较一个箱子是否能放在另一个箱子提供了方便,如果一个箱子底面积小于另一个,那么必然不能放在下面,按照箱子底面积排序 dp[i]表示选第i个箱... 阅读全文
posted @ 2017-03-15 13:53 N维解析几何 阅读(75) 评论(0) 推荐(0)
摘要:题意:最大子序列和加强版,恰好有m个子序列,输出这m个子序列的最大和 分析:先想一下最大子序列和,用dp[i]表示选第i个数的最大和,那么max(dp[i])0<i<=n就是答案 恰好分为m个,那么增加一维表示选第i个并且恰好分为j块的最大和,那么可以轻松得到状态转移方程 dp[i][j]=max( 阅读全文
posted @ 2017-03-15 13:23 N维解析几何 阅读(129) 评论(0) 推荐(0)
摘要:题意:给一个n*m的图,图上点有两种状态,0和1,1表示可以标记,0不可以,如果一个点标记之后,他的上下左右都不可以标记,求所有的可能的情况 分析:n,m<=12,我们可以想到用二进制表示每个点的状态,是否标记,那么dp[i][j]=sum(dp[i-1][k]),i表示行,j表示状态,比如5,二进 阅读全文
posted @ 2016-03-03 11:53 N维解析几何 阅读(169) 评论(0) 推荐(0)
摘要:题意:第k小的01背包,重复的选项算一个 分析:01背包问题,只考虑到第i个问题的各个体积的最优解,而第k大的01背包则需要更多的选项,有个博客举了这样一个例子 我们年纪一共10个班,如果我想知道年纪第一,我需要知道每个班级的第一名,一比较,那么我就知道年纪第一是谁了 如果我要知道年纪前十名,那么, 阅读全文
posted @ 2016-02-28 20:03 N维解析几何 阅读(229) 评论(0) 推荐(0)
摘要:题意:平面上有n个点,所有点的x坐标均不同,两点之间的花费为两点之间的欧几里得距离,从最左面出发,到最右面返回 所有点除最左和最右路过两次,其他的路过一次,输出最小花费 分析:按照题意无法定义路过点的状态,把路径理解为两个人同时从最左出发,到达最右点,中间的点只能一个人走且只能一次,这样就可以用(i 阅读全文
posted @ 2016-02-28 16:14 N维解析几何 阅读(218) 评论(0) 推荐(0)
摘要:题意:有n个立方体,要堆成一个尽量高的主子,每个立方体上面放的立方体的长宽都严格小于下面,每个立方体有无限个 分析:我的做法是,每个立方体最多有6种状态,那么也就拥有6n个固定长宽高的立方体,那么这就是一个DAG上的最长路,6n个正方体,O(n^2)的算法, 很简单,详情见代码 #include<b 阅读全文
posted @ 2016-02-27 21:25 N维解析几何 阅读(324) 评论(0) 推荐(0)
摘要:题意:总共有n个车站,一个特务开始的时候在1车站,他需要在T时刻到达n车站会见一个人,如果他在车站停留的时间越长,那么他被发现的几率就越大 电车从i到i+1车站的时间为ti,然后又m1辆车在1车站往n车站走,分别给出这m1辆车从1车站出发的时间,有m2辆车从n车站往1车站走,该特务的身手敏捷,如果在 阅读全文
posted @ 2016-02-27 20:49 N维解析几何 阅读(227) 评论(0) 推荐(0)
摘要:LIS就是给定n个数,a1,a2....an,按照从左到右的顺序,选出一些数,组成一个上升子序列 ,例如1 6 2 3 7 5,可以选出1 2 3 5,也可以1 6 7,但是前面的要更长一些 dp[i]表示以ai结尾的最长的上升子序列的长度,那么dp[i]={max(dp[j])+1,j<i&&nu 阅读全文
posted @ 2016-02-24 09:54 N维解析几何 阅读(272) 评论(0) 推荐(0)
摘要:题意描述: 求解给定的两个序列的最长的子序列 算法分析: 用F[i][j]表示到 第一个序列i 第二个序列j的时候最长的子序列 代码实现: if(A[i]==B[j]) F[i][j]=F[i-1][j-1]+1; else F[i][j]=max(F[i-1][j],F[i][j-1]); F[n 阅读全文
posted @ 2015-05-28 12:23 N维解析几何 阅读(119) 评论(0) 推荐(0)
摘要:题目描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。 分析 继续用动态规划的思路来解决 由于是连续的子序列,所以可以用F[n]保存到第n个数时的最大值,然后取其中的最大值就可以了 代码实现: int 阅读全文
posted @ 2015-05-28 11:45 N维解析几何 阅读(341) 评论(0) 推荐(0)
摘要:#include using namespace std; const int maxn=100; int p[maxn],tot; /* 抢地主的过程中尽量去凑成王炸,不过为啥影响不大 斗地主出王炸的概率,腾讯笔试题,这个竟然有人猜的到应该大于0.3 正确的概率差不多是33.5+,不过我没算出来,只能跑下随机数了 如果一个人手中有一个王,那么就给他凑成一个王炸 不过和直接拿... 阅读全文
posted @ 2015-05-27 22:40 N维解析几何 阅读(1144) 评论(0) 推荐(0)