
动态规划 & 贪心
文章平均质量分 64
SuPhoebe
不是我针对谁,我是说在座的诸位都比我强
展开
-
Google Code Jam 2018: Qualification Round
资格赛,除了最后一题比较有趣以外,其他都比较简单Saving The Universe Again贪心 一开始想着尽可能将S往前移,但是想了想觉得这样移动好多次,可能才等于后面的S往前移一位的成果。 所以就变成尽可能地将C往末尾移(末尾一段连续的C就不用考虑了),即,每一次移动减少的伤害最大。int T,n;vi a1,a2;int main(){ cin>&...原创 2018-04-09 00:19:56 · 1754 阅读 · 0 评论 -
BUPT 2014新生暑假个人排位赛05
BOJ 442 平方的平均值注意看题啊,用long long和绝对值是肯定原创 2014-07-23 23:20:25 · 803 阅读 · 0 评论 -
Codeforces Round #320 (Div. 1) B. "Or" Game
贪心思路: 因为是或的关系,所以只要使得某个数尽可能得大就可以了。 于是第一个想法是,选出最大的那个数,使得它乘以k次最大。但是这样会有部分情况是错误的。 比如 2 1 49 102\ 1\ 4\\ 9\ 10 当最大值和次大值相近的情况下,有可能他们的k次乘积后两者并没有差一个二进制,而你将大的那个乘起来之后可能导致你在低位有损失。所以就暴力枚举每一个位置乘以k次之后的值,求或得到答案。原创 2015-09-17 10:35:42 · 513 阅读 · 0 评论 -
gym 100430 G【贪心+map瞎搞】
题意: 给你N个东西,其中任意两种东西可以合成。 问你最多可以合成多少东西。 在最多合成东西的情况下,要使得字典序最小。思路: 先按照贪心的方法构造出字典序列最优的解。 然后有可能有一个剩下了一些的数量的东西(也可能没有) 那么就按照字典序从后往前扫,强行将最后的几对拆开来和剩余的匹配。#include <cstdio>#include <cstring>#i原创 2015-09-29 20:33:15 · 662 阅读 · 0 评论 -
Testing Round #12
A. Divisibility 直接分类讨论#include<bits/stdc++.h>using namespace std;int main(){ long long a,b,c; cin>>c>>a>>b; long long ans = 0; if(a<=0 && b<=0) { swap(a,b); a=-a,b原创 2015-11-14 17:14:29 · 610 阅读 · 0 评论 -
Technocup 2017 - Elimination Round 2 D. Sea Battle
算是正式开始康复训练啦这是一题简单的思维题… 第一想法是鸽巢原理,因为“最小数量“,“至少一个“等关键词。 那么,就要先知道鸽巢的总数,也就是可能是船的位置的数量。这个时候就要用贪心做,然后只需要保存每个船整个身位中的一个点就行。 然后用鸽巢原理输出数目和顺序就行。#include <cstdio> #include <cstring> #include <algorithm> u原创 2016-11-22 10:52:59 · 561 阅读 · 0 评论 -
LeetCode 446. Arithmetic Slices II - Subsequence
一道长得一副dp的样子的dp题。这道题难度不算特别大,因为看得出来肯定是dp题。因为,一个等差序列里面有好几个小的等差序列。 例如,2 4是一个等差序列,2 4 6是一个等差序列。 所以我们发现等差序列是可以扩展的。那么就得到了,咱们的转移方程的一部分 dp[i][delta]=dp[j][delta]+1dp[i][delta] = dp[j][delta] + 1 其中i,j是表示该数在原创 2016-11-24 15:54:22 · 1516 阅读 · 0 评论 -
ACM竞赛中的逆向思维
在竞赛过程中,尤其是近期训练,遇到了不少一定要用逆向思维才能解决的题目。 为此做一系列的总结。希望能够对大家有所帮助。 同时,我也会做成PPT,供14级训练使用。其中有部分问题摘自于2005年国家集训队唐文斌的《正难则反–浅谈逆向思维在解题中的应用》论文。容斥方面逆向思维在容斥方面的应用相当广泛,也可以说容斥就是逆向思维的一种体现。HDU 5072 Coprime 同色三角形题目大意:给了nn个原创 2015-10-29 17:02:47 · 2181 阅读 · 1 评论 -
Codeforces Round #323 (Div. 1) C. Superior Periodic Subarrays
每个i位置对于某个s,会支配所有x mod len = i mod len的位置,其中x是[l+j]*s。 举个例子 n=3,s=2,则a[1]≥a[1],a[2],a[3]:1 2 3 1 2 31 2 1 2 1 2n=3,s=2,则a[1]\geq a[1],a[2],a[3]:\\ 1\ 2\ 3\ 1\ 2\ 3\\1\ 2\ 1\ 2\ 1\ 2 n=4,s=2,则a[1]≥a[原创 2015-10-05 23:11:31 · 907 阅读 · 0 评论 -
Codeforces Round #323 (Div. 1) B. Once Again...
简单DP 给了hint之后规律特别明显。 我们可以明显发现,当nn个数全部被选择完之后,就选择所有数里面最大的那个。 那么最多选多少次能够将nn个数选择完毕呢? 样例是选了2次选择完的 那么举一个例子5,4,3,2,15,4,3,2,1。这个就需要选择5次。因此最坏情况就是nn次。 如果T≤n→N=T×nT\leq n\rightarrow N=T\times n,那么明显可以暴力直接做原创 2015-10-05 11:44:00 · 544 阅读 · 0 评论 -
Aizu 2541 Magical Bridges
题意: n个岛屿,由m条桥连接,其中有k条是魔法桥,你可以用魔法把他们变成相同长度。 求在执行魔法后,两个起点S1和S2到终点T的最短路的最小绝对差。 (1≤n≤1000,1≤m≤2000,1≤k≤100)(1\leq n\leq 1000,1\leq m\leq 2000,1\leq k\leq 100)S1S_1和S2S_2到TT的最短路将会是如 j×x+disj\times x+dis原创 2015-09-16 00:21:22 · 559 阅读 · 0 评论 -
Aizu 2538 Stack Maze【记忆化搜索】
其实我并不知道我的姿势算是什么。 一开始想着用二维的记忆化搜索,用dp[x][y]dp[x][y]表示(x,y)→(H,W)(x,y)\rightarrow(H,W)能够得到的最大happy值。但是很遗憾的是,这样没法记录,在前进的路上,我有多少个宝石、能够经过多少宝石洞。 所以就想着如何记录,最后发现难以记录。如果是这样的记忆化搜索,时间复杂度大约是O(n2)O(n^2),那么就想着可以进行扩原创 2015-09-15 21:24:24 · 515 阅读 · 0 评论 -
HDU 5401 Persistent Link/cut Tree
考虑爆搜,树i生成后,两两点对路径分成两部分,一部分不经过中间的边,那么就是aia_i和bib_i的答案,如果经过中间的边,首先计算中间这条边出现的次数,也就是aia_i,bib_i子树大小的乘积。对于aia_i,对答案的贡献为所有点到cic_i的距离和乘上bib_i的子树大小。bib_i同理。那么转化为计算在树i中,所有点到某个点j的距离和。假设j在aia_i内,那么就转化成了aia_i内j这个点原创 2015-08-18 22:04:23 · 1053 阅读 · 0 评论 -
HDU 5378 Leader in Tree Land【树形DP】
第一种思路是最普遍的树形DP dp[u][i]dp[u][i]表示u这个节点以及下面的子树,有i个leader的方案数。 首先,我们考虑,每棵子树上面的leader,他们的个数是不会因为父亲节点的取值而减少的,所以符合加法性质,因此可以直接累加上去。于是可以用背包的方式直接累加上去。 其次,要计算一次组合数,和普通的树形DP相像,从一开始可以分配Csz[v]sz[u]C_{sz[u]}^{sz原创 2015-08-12 17:09:51 · 631 阅读 · 0 评论 -
数位DP专题小结--by sgx
数位DP,一句话概括,就是在一个给定区间内求出满足某中奇葩条件的数字个数,这真是奇葩题目,但是总体写起来又有一定规律性。主要可以分为以下几个步骤:确定主体框架,确定一个大方向,想想该如何设计状态;下面基本就是模板,直接DFS就行了,一位一位处理,这也是他叫按位DP的原因。数位DP代码一般都很短,不过效率挺好,解决一些竞赛中出现的问题非常有用 。如果看了这部分 ,你感觉还转载 2015-08-08 14:27:30 · 1927 阅读 · 0 评论 -
HDU 5014 Number Sequence
贪心可证明从大往小找异或的原创 2014-09-14 21:26:27 · 680 阅读 · 0 评论 -
Codeforces Round #277.5 (Div. 2) C. Given Length and Sum of Digits...
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace st原创 2014-11-18 09:30:13 · 568 阅读 · 0 评论 -
Codeforces Round #279 (Div. 2) E. Restoring Increasing Sequence
用了一个简单易懂但是实现比较慢的方法贪心,先用含有问号串构造出最大的满足条件的值(即?用9代替),如果再挨个位数比较,如果减下去还能大于上一个的值,则就减从而使得现在的数是满足条件中最小的。因为是从可能的最大的开始减少,如果还是比前一个小则不可以;因为前面的前部都是满足条件中最小的数,所以给后面的数留出了最大的改变空间。// whn6325689#include原创 2014-11-30 21:09:44 · 674 阅读 · 0 评论 -
BUPT 2014新生暑假个人排位赛03
A. 学姐的数码管原创 2014-07-18 23:40:28 · 948 阅读 · 0 评论 -
HDU 5406【费用流 或 dp+树状数组】
拆点,容量为1表示每个点只能用一次,费用为-1表示经过了几个点 建立超级源向源点连接容量为2的边,表示两个上升序列。spfa用了栈就可以过了。// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#include <algorithm>#include <iostream>#include <i原创 2015-08-31 23:19:35 · 721 阅读 · 0 评论 -
Poj 1112 Team Them Up!
首先分析这道题目,题目给出的是一个有向图,即如果有A认识B,但不一定有B认识A。但是在所分配的组里面,任意两个人都要互相认识。1、 先读入数据建立有向图,然后对这个有向图进行处理,如果两个点之间的边是单向边,就认为两个点之间无边(因为这两个人不互相认识),对于两个点间的双向边,即建立一条无向边(这两个人互相认识),这样就可以把一个有向图转化为一个无向图。2、 将这个无向图转化为它的原创 2014-08-12 10:45:09 · 1152 阅读 · 0 评论 -
Memory Game
Memory GameThe game of Memory is played with NN pairs of cards where each pair has the same picture, i.e. there are NN different pictures, and each of them appear on exactly two cards.The cards are shu原创 2017-09-30 10:02:35 · 500 阅读 · 0 评论 -
Leetcode 523. Continuous Subarray Sum
有趣的dp我们要求的是num[L] + num[L+1] + … + num[R] mod k 是否等于零。所以我求一个前缀和A[L] + A[L+1] + … + A[R] = P[R+1] - P[L]则我们要求 P[R+1] - P[L] mod k = 0 那么我们现在对每一个P[i] mod k,则只需要判断p[R+1] - P[L]是否为零,也就是是否存在两个相同的P[i]且距离相差2以原创 2017-03-06 21:14:45 · 518 阅读 · 0 评论 -
779C - Dishonest Sellers
C. Dishonest SellersIgor found out discounts in a shop and decided to buy n items. Discounts at the store will last for a week and Igor knows about each item that its price now is ai, and after a week原创 2017-02-26 20:09:08 · 1052 阅读 · 0 评论 -
Leetcode 68. Text Justification
简单贪心题注意:如果一行只有一个单词的话,那所有的空格放在单词右边。尽可能地平均分配空格(题目中说了)python代码,非常优美class Solution(object): def fullJustify(self, words, maxWidth): """ :type words: List[str] :type maxWidth:原创 2017-02-15 10:29:44 · 525 阅读 · 0 评论 -
面试经典动态规划问题
经典动态规划问题三角数塔问题设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,如图所示:要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。思路从叶节点倒推回根,因为每个节点只可能向左或者向右,所以转移方程为dp[i][j] = num[i][j] + max(dp[i+1][j],dp[i+1][j+1])代码#include <stdio.原创 2017-02-21 20:25:51 · 9291 阅读 · 1 评论 -
BUPT 2014新生暑假个人排位赛02
A. 丁神去谷歌原创 2014-07-17 00:04:56 · 983 阅读 · 0 评论 -
HDU 5353 Average
思路: 找到一个非零的点,然后从左贪心地走一遍,然后从右贪心走一遍 贪心就是如果现在的数是大于零的数,则给下一位; 如果现在的数是小于零的数,则下一位给我。比赛的时候就是想太多了….// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#include <algorith原创 2015-08-06 17:54:25 · 1073 阅读 · 0 评论 -
HDU 5385 The path
如果我们知道每个点的disdis值和最短路径树的话,方案是很容易构造的我们可以采取贪心做法,一开始将11号点作为最短路径树的根,然后左边从22开始,右边从nn开始,只要之前加入的点有边连向他们就加入这样一个点加入的时间就是他的disdis值,最短路径树上的父亲也可以确定,于是输出时非树边长度为nn,树边长度为两个端点disdis之差。// whn6325689// Mr.Pho原创 2015-08-13 20:50:02 · 800 阅读 · 0 评论 -
UVALIVE 5000 Underwater Snipers(二分+贪心)
二分答案贪心判断// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#include #include #include #include #include #include #include #include #include #include #include #incl原创 2015-02-26 11:06:17 · 627 阅读 · 0 评论 -
Codeforces Round #288 (Div. 2) C. Anya and Ghosts
题目大意:给出n个鬼访问的时间,和每个蜡烛可以持续的时间,每次访问最少需要的点燃的蜡烛数。问一共最少需要几个蜡烛。将每个蜡烛的点燃的时间尽量靠近访问的时间,所以,统计第i个访问时点燃的蜡烛,如果少于r,那么要访问的时间开始,向前遍历,找出最近的可以点燃蜡烛的时刻,这样可以保证使用的蜡烛最少。注意1、可以在子夜之前点蜡烛,所以要将时间右移。2、蜡烛持续的时间t和点燃的时间j的关系为,原创 2015-01-28 16:53:10 · 605 阅读 · 0 评论 -
Good Bye 2014
B. New Year Permutation用floyd算出每个点能够到达的所有点然后再在没有用过的点中找一个最小的放过去// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#include #include #include #include #include #include #in原创 2014-12-31 13:02:01 · 659 阅读 · 0 评论 -
HDU 5293 Tree chain problem【树形DP】
树形DP dp[i]dp[i]:表示以节点i为根的子树的最有情况 sum[i]sum[i]:表示∑dp[k]\sum dp[k](其中k是i的儿子) 转移情况有两种: 一是:dp[i]=sum[i]dp[i]=sum[i] 二是:选取一条链p,其中p的两个端点的LCA为节点i dp[i]=max(dp[i],val[p]+∑(sum[k])−∑(dp[k]))dp[i]=\max(dp[原创 2015-07-22 20:53:32 · 650 阅读 · 0 评论 -
UVA 12295 Optimal Symmetric Paths(spfa+记忆化)
题意: 求从左上角到右下角的最短路径数,且要求沿斜线对称 思路: 既然要求对称,所以我们将对称的权值叠加,那么就是求到对角线的最短路径了,通过dp解决方案数// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#include <algorithm>#include <iostream>#i原创 2015-06-07 20:57:23 · 809 阅读 · 0 评论 -
UVA 12297 Super Poker(矩阵快速幂)
想到了一个递推式 f(n,k)=f(n−k,k)+f(n−k,k−1)∗4+f(n−k,k−2)∗6+f(n−k,k−3)∗4+f(n−k,k−4)f(n, k) = f(n-k, k) + f(n-k, k-1) * 4 + f(n-k, k-2) * 6 + f(n-k, k-3) * 4 + f(n-k, k-4) 这里f(n,k)f(n, k)表示用k张牌组成和为N的方案数,在递推的时候原创 2015-06-07 18:13:21 · 1131 阅读 · 0 评论 -
HDU 4055 Number String
dp[ i ][ j ]表示前i个满足字符串条件的结尾为j的 i 的排列,注意是i的排列,前面并没有数大于i。那又是如何往下递推呢?如果s[i - 1]是' I ',那么dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2] + .. + dp[i-1][1]如果s[i - 1]是‘D’,那么dp[i][j] = dp[i-1][j] + dp[i-1][j+原创 2014-08-10 17:06:37 · 543 阅读 · 0 评论 -
HDU 4689 Derangement
考虑到每个数字 i 只有两种放置方式,前面或者后面,同时,某个状态,’-‘一定是放置前面的数,’+’一定是放置后面的数,这样,我们设计状态f[i][j],表示前i个有j个‘+’没有解决,由于都是要放置后面的数,且前面的剩余什么数对后面没有影响,故状态设计没有问题。如果第i个是‘+’,则考虑i放在前面还是后面,如果放在后面,则f[i][j]+=f[i-1][j-1],否则,j放在前面哪一个‘原创 2014-08-10 15:55:46 · 917 阅读 · 0 评论 -
Codeforces Round #260 (Div. 1) A. Boredom
简单动态规划用计数排序统计数字的个数dp[ ]#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include原创 2014-08-09 10:33:16 · 688 阅读 · 0 评论 -
HDU 4960 Another OCD Patient
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define CLR(x,y) mem原创 2014-08-19 22:34:34 · 603 阅读 · 0 评论 -
HDU 4915 Parenthese sequence
从前扫一遍,记录最大和最小的可能的左括号的值#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include原创 2014-08-05 18:54:57 · 1000 阅读 · 0 评论