<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Crossing over]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/coord_</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; coord_]]></copyright><item><title><![CDATA[HDU 3709 Balanced Number]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/95041063</link><guid>https://blog.youkuaiyun.com/coord_/article/details/95041063</guid><author>coord_</author><pubDate>Sun, 07 Jul 2019 23:22:48 +0800</pubDate><description><![CDATA[传送门
数位dp。（这题比较牛批）
给你一个数，如果能选取这个数的某个数位作为支点（pivot），使得支点左右两边的各个数位的加权和相等（不包括支点）（权值为该数位到支点的距离），那么就称这个数为平衡数。然后问你[x,y]中有几个平衡数。
举个例子，4139是平衡数（以3为支点），20是平衡数（以2为支点）。。。
以下几点：

将题目条件转化为一个在各个数位上连续计算的公式。就像HDU 4734那...]]></description><category></category></item><item><title><![CDATA[HDU 3652 B-number]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/95027071</link><guid>https://blog.youkuaiyun.com/coord_/article/details/95027071</guid><author>coord_</author><pubDate>Sun, 07 Jul 2019 21:59:10 +0800</pubDate><description><![CDATA[传送门
数位dp。
有一种数，能被“13”整除而且数位里包含“13”，求[1,n]中这种数的个数。
for short是简称的意思。
之前求过数位里不包含“XX”的，中途判断就可以了。但如果求的是包含的个数，要么取反、要么只能最后判断。
以下几点。

这道题要用三维状态，两个条件各用一维。这两个条件都是运行到最后一位（反正大概是最后）才能判断出来。
对包含“13”的判断，设计三个状态，分别表示：之...]]></description><category></category></item><item><title><![CDATA[HDU 5179 beautiful number]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/94635991</link><guid>https://blog.youkuaiyun.com/coord_/article/details/94635991</guid><author>coord_</author><pubDate>Thu, 04 Jul 2019 18:33:34 +0800</pubDate><description><![CDATA[传送门
数位dp。（要考虑前导0，类似还有POJ 3252）
定义一种数，要求在其十进制数位上，较高位都&gt;=较低位，且较高位%较低位都是0（较高位都能被较低位整除）。问你[L,R]内有多少个这种数。
需要注意几点。

dp第二维记录第i+1位数字，整除关系可以传递。中途判断。
默认之前位都已满足要求，所以只要当前位能整除第i+1位，就可整除前面任意一位。
满足要求的数中，只有一个数可以含有0...]]></description><category></category></item><item><title><![CDATA[POJ 3252 Round Numbers]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/94592137</link><guid>https://blog.youkuaiyun.com/coord_/article/details/94592137</guid><author>coord_</author><pubDate>Thu, 04 Jul 2019 00:47:18 +0800</pubDate><description><![CDATA[传送门
数位dp。
定义一种数，其二进制表示中0的个数大于等于1的个数。给你[Start,Finish]，问其中多少个这种数。
说几点。

首先可以想到，这个题没办法中途continue了，只能到最后（pos==-1）才能判断。
状态可以有两种设计方法，一种是两维，分别表示前面数位中0和1的个数；
另一种是一维，表示前面数位中0多于1的个数（必须确定谁比谁多，请不要混淆为绝对值）。
可以看出，后者...]]></description><category></category></item><item><title><![CDATA[HDU 4734 F(x)]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/94591438</link><guid>https://blog.youkuaiyun.com/coord_/article/details/94591438</guid><author>coord_</author><pubDate>Wed, 03 Jul 2019 23:01:20 +0800</pubDate><description><![CDATA[传送门
数位dp。
给一个函数F(x)，然后问你对于[0,B]中的每个数x，满足F(x)&lt;=F(A)的x的个数。
inclusive表示闭区间。
可以看出，题目定义的这个函数和每个数位相关。
所以，在对每个数位进行dfs的过程中，随着这个数一点点被确定，这个数的F(x)也逐渐被确定（而且这个过程是单调递增的，非严格）。
所以可以想到dp的第二维表示：从最高位到第i+1位的部分F(x)值。
所...]]></description><category></category></item><item><title><![CDATA[HDU 3555 Bomb]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/94591195</link><guid>https://blog.youkuaiyun.com/coord_/article/details/94591195</guid><author>coord_</author><pubDate>Wed, 03 Jul 2019 22:19:20 +0800</pubDate><description><![CDATA[传送门
数位dp。
给一个N，问你从[1,N]中包含49的数的个数。
主要有两点。

solve(x)求的是[0,x]中不包含49的个数（一检测到“49”就continue了）
这题要用__int64，这玩意linux还用不了，所以定义一个typedef是好习惯，方便改。

#include &lt;cstdio&gt;
#include &lt;iostream&gt;
#include &lt...]]></description><category></category></item><item><title><![CDATA[HDU 2089 不要62]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/94590636</link><guid>https://blog.youkuaiyun.com/coord_/article/details/94590636</guid><author>coord_</author><pubDate>Wed, 03 Jul 2019 22:03:18 +0800</pubDate><description><![CDATA[传送门
数位dp。
给一个左闭右闭区间，统计个数。
dp[i][j]表示当前从第i位枚举到最低位(第0位)、在j状态下符合条件的个数。
j表示第i+1位是不是6。
初识数位dp，说几点看法。

之所以要设计这么个dp数组，就是为了重复利用（记忆化搜索）。不这么干的话，每种i,j的组合都可能要被计算多次。现在只用第一次计算，然后再碰见这样的i,j组合就不用再算了。
当然，前提是不在limit模式下。...]]></description><category></category></item><item><title><![CDATA[CCF CSP 201312 4.有趣的数]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/94219135</link><guid>https://blog.youkuaiyun.com/coord_/article/details/94219135</guid><author>coord_</author><pubDate>Sat, 29 Jun 2019 23:10:51 +0800</pubDate><description><![CDATA[数位dp。
这种题光看代码真是头疼，想了一个小时才想明白当时的思路。
思路如下：
题目问你x位有趣的数有多少个，记为c[x]，那么就要想出来c[x]怎么用c[x-1]表示。
x位有趣的数一定都可以由一个x-1位的数m在末尾添加一个数字而构造出来，分为两种情况：

m是有趣的数
可以想到，只能在末尾添加1或3，这两种添加方式都一定有效。
m不是有趣的数
若在m后添加一个数字能使其变为有趣的数，则m一...]]></description><category></category></item><item><title><![CDATA[PAT T1016 Uniqueness of MST(35)]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/90815345</link><guid>https://blog.youkuaiyun.com/coord_/article/details/90815345</guid><author>coord_</author><pubDate>Tue, 04 Jun 2019 23:34:05 +0800</pubDate><description><![CDATA[传送门
无向图，判断其mst的唯一性，若没有mst则输出连通分量数。
结论：只有当原图中存在权值相等的边的情况下，才有可能会造成mst不唯一。
还是原来的kruskal算法，但是设置一个两层循环来从小到大遍历边，其中内层循环遍历的都是权值相同的边（神似PAT A1009，在一个有序数列中合并“同类项”。。）
使用两个这样的内层循环：

前者在上一次外层循环的状态下测试每条边的可用性；（计数变量ed...]]></description><category></category></item><item><title><![CDATA[关于判定4种无向图的一些想法]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/90050793</link><guid>https://blog.youkuaiyun.com/coord_/article/details/90050793</guid><author>coord_</author><pubDate>Fri, 10 May 2019 02:28:54 +0800</pubDate><description><![CDATA[回顾了这几道题之后，写一些总结。

HDU 1198（求解 无向图 有几个 连通分量）
HDU 1272（判断 无向图 是不是 无环连通图）
HDU 1325（判断 有向图 是不是 树）

下面是无向图的四种情况：




无环连通图
有环连通图
无环非连通图（每一个连通分量都是无环的）
有环非连通图（至少有一个连通分量是有环的）




边数 = 点数 - 1
边数 &gt; 点数 - 1
边数...]]></description><category></category></item><item><title><![CDATA[HDU 2037 今年暑假不AC]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89818771</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89818771</guid><author>coord_</author><pubDate>Sat, 04 May 2019 22:08:24 +0800</pubDate><description><![CDATA[传送门
贪心法。
贪心策略就是优先选开始时间较晚的节目 或者 优先选结束时间较早的节目，先排序，然后一遍顺序求解。
如果要求的不是节目个数最大，而是节目总时长最大（或者每个节目都有一个价值，要求总价值最大），该怎么解决呢？

#include &lt;cstdio&gt;
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &...]]></description><category></category></item><item><title><![CDATA[HDU 1421 搬寝室]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89784552</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89784552</guid><author>coord_</author><pubDate>Fri, 03 May 2019 05:14:20 +0800</pubDate><description><![CDATA[传送门
多阶段决策dp。（另一种思考方式是转化为求 最小的不相邻的要求必须正好选k个的子序列和。。代码一样。。参考这个的第二种方法）
选k对物品，要求每对物品重量的平方差的和最小。
这道题必须想清楚一个结论：最优解的每一对物品在排序后的序列中一定都是相邻的。这句话从下面两个方面理解：

每一对物品相邻 指的是这对物品内的两个物品是相邻的。
最优解的每一对物品都相邻。所以，若n=2k，则最优解可以排...]]></description><category></category></item><item><title><![CDATA[HDU 1257 最少拦截系统]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89528324</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89528324</guid><author>coord_</author><pubDate>Thu, 25 Apr 2019 23:09:26 +0800</pubDate><description><![CDATA[传送门
贪心？+二分。（还可以用dp。。）
首先要把问题想清楚，每个拦截系统负责拦截的导弹子序列都必须是递减的（不要求严格递减）。给你一个总体的导弹到达序列，问你最少安排多少个拦截系统。
可以想到，每个拦截系统都有一个当前可用的上限值，表示这个系统当前可拦截的最大值。

对导弹到达序列逐个分析，若当前导弹大于 每一个拦截系统的上限，则一定要安排一个新系统，并把新系统的上限置为当前导弹。
若上述条件...]]></description><category></category></item><item><title><![CDATA[HDU 2830 Matrix Swapping II]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89500296</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89500296</guid><author>coord_</author><pubDate>Wed, 24 Apr 2019 18:31:33 +0800</pubDate><description><![CDATA[传送门
直方图dp二维版（link）。。的巧妙变形（可以任意交换两列从而构成一个新状态）。
以下两点：

其实这种题没必要用二维数组了，按照输入的顺序，在输入完每一行后就处理这一行。这样只用开两个列数大小的数组，其中一个缓存上一行（从而构造当前行的数据）。
这道题说可以任意交换两列无数次，那么就必须每一行每一行地处理了，因为每行的数据不会乱。
这个条件就是等价于可以把每一行的这些柱形排列成一个最优...]]></description><category></category></item><item><title><![CDATA[HDU 2845 Beans]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89498042</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89498042</guid><author>coord_</author><pubDate>Wed, 24 Apr 2019 17:05:40 +0800</pubDate><description><![CDATA[传送门
最大不相邻子序列和（二维版本）。（没有负数的版本）
这个题先要求出每行的最大不相邻子序列和（所谓不相邻，就是指这个子序列的每个元素在原数组里都是不相邻的），然后将这个矩阵的每行的最优解都当成一个元素，对这个列向量再应用以上。
输入按先行再列，所以边输入边求解，也没必要搞二维数组了（这题只给你一个n*m上限就是逼你这么做的）。
没有负数的情况下，可以想到，最优解的两个元素中间最多隔两个。还是...]]></description><category></category></item><item><title><![CDATA[HDU 2577 How to Type]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89480267</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89480267</guid><author>coord_</author><pubDate>Tue, 23 Apr 2019 20:19:54 +0800</pubDate><description><![CDATA[传送门
多阶段决策dp。
给你一个只包含大小写字母的字符串，问你打这个字符串最少按多少次键。
这题也是够傻逼了。说几点需要注意的：

大小写转换不仅可以用capslock，还可以用shift。（通过样例得知）
它说的题意是指“在打完所有字后，如果大小写锁定还开着，那么就关闭”。并不是下一个字符是小写字母了就要关capslock。
下一个字符是小写字母了但如果就是不关capslock该怎么操作？很简...]]></description><category></category></item><item><title><![CDATA[HDU 1559 最大子矩阵]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89476241</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89476241</guid><author>coord_</author><pubDate>Tue, 23 Apr 2019 16:54:58 +0800</pubDate><description><![CDATA[传送门
水题（基本上不能算dp了，就是一个用累加和求区间和（二维版）的思想）。时间复杂度O(n^2)。
HDU 1081才是真正的“最大子矩阵和”（最大子串和的二维版）。时间复杂度O(n^3)。
因为给定了子矩阵的行数，所以真的不用再来两层循环确定顶行底行了。。。然后还是将之视为一行（每列的累加和）。而且子矩阵的列数也给了，那就对这一行再来一遍累加，然后枚举M-Y+1次就完事了。
这种题还可以这么...]]></description><category></category></item><item><title><![CDATA[HDU 2159 FATE]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89441542</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89441542</guid><author>coord_</author><pubDate>Sun, 21 Apr 2019 22:45:33 +0800</pubDate><description><![CDATA[传送门
完全背包，有两维容量。
它说的耐久度是根据杀怪来不断减少的，当耐久度降到0或者0以下时就不玩了，但有一个非常重要的地方没有说清。
这个判断是在每杀一只怪之前判断还是每杀一只怪之后判断？？？
下面所叙述的一切以及AC代码都是建立在 “之前判断，且降到0判断为可杀、降到0以下判断为不可杀” 的基础上。

所以这个耐久度就等价于一个容量的限制，杀的所有怪的耐久度之和要小于等于这个容量。然后还有一...]]></description><category></category></item><item><title><![CDATA[HDU 1203 I NEED A OFFER!]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89438679</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89438679</guid><author>coord_</author><pubDate>Sun, 21 Apr 2019 20:27:24 +0800</pubDate><description><![CDATA[传送门
01背包，价值是概率连乘。
首先，给的都是某学校被录取的概率，问的是总体被录取的最大概率，所以要转化为都不被录取的最小概率。
dp[j]表示（在前i个学校可选取的情况下，）使用的申请费总额不超过j的情况下不被任何一家录取的最小概率。
所以初始的dp值都是1.0。
本题和HDU 2955的区别在于，前者求最小概率，后者求最大概率。因而要采取不同的策略：

本题：因为价值是概率连乘，只会越来越...]]></description><category></category></item><item><title><![CDATA[HDU 2844 Coins]]></title><link>https://blog.youkuaiyun.com/coord_/article/details/89427020</link><guid>https://blog.youkuaiyun.com/coord_/article/details/89427020</guid><author>coord_</author><pubDate>Sun, 21 Apr 2019 02:46:52 +0800</pubDate><description><![CDATA[传送门
多重背包，重量与价值相同，恰好装满。
和这个题差不多。有n种硬币，每种硬币都有一个数量和价值，问你拿这些硬币能恰好支付多少个价格（价格区间[1,m]），支付每个价格都可用全部的硬币。
方法就是将重量和价值视为相同，然后再恰好装满，所以dp[j]表示恰好拿取价值总和为j的硬币所获得的（最大，233）价值。可以想到，这个值要么是非法值，要么是j。
这个题给的硬币价值总和的上限太大了，肯定不能用...]]></description><category></category></item></channel></rss>