摘要:2009: Zeros and Ones 问题:给出一个$N$位($N\le64$且为偶数)的二进制数并且没有前导$0$,且$0$和$1$的个数都是$N/2$.给出另一个整数$K$,求解满足上述条件并且能被$K$整除的二进制数的个数。 分析:动态规划。定义$dp[i][j][k]$为前$i$位中有$
阅读全文
摘要:2469: Exploring Pyramids 问题:给出一棵树我们可以写出它的深搜结果,现在给出深搜结果字符串$S$求解对应树的种类数。 例子:深搜结果:$ABABABA$,对应的树(根结点在底层)有$5$个。 分析:应用区间动态规划,定义$dp[i][j]$为$S[i..j]$对应的树的个数,
阅读全文
摘要:SOJ 4454: 写作业 问题:给出递推式$f_{1}=2$, $f_{2}=2$, $f_{n}=f_{n-1}+3f_{n-2}+1$, 求解$f_{n}\%1000000007$. 分析:类似于求解斐波那契数(参考这里),利用矩阵的快速幂算法,关键是写出矩阵形式。下面是一种最自然的方式, $
阅读全文
摘要:SOJ 2984: Fibonacci 问题:给出一个非负整数$n$,输出第$n$个斐波那契数$F_{n}$对$10000$取模的结果。 分析:利用最直接的方法(从$F_{0},F_{1}$开始迭代)求$F_{n}$的时间复杂度为$O(n)$.如果要求出所有的$F_{n}$,这种方法已经是最优的了,
阅读全文
摘要:SOJ 2763: Factorial 问题:给出两个数$N(1\le N\le 10^{9})$和$B(2\le B\le 100000)$,求解$N!$以$B$为基表达时末尾$0$的个数。 例子:(1)$7!$以$10$为基时等于$5040$,此时末尾有$1$个$0$. (2)$7!$以$2$为
阅读全文
摘要:SOJ 1069: Brackets 题意:给出由$(,),[,]$四个字符组成的序列$S$,输出符合要求的括号序列的最大长度。下面是符合要求的括号序列的递归定义: (1)空序列; (2)如果$S$是,那么$(S)$和$[S]$也是; (3)如果$S$和$T$是,那么$ST$也是。 分析:这个问题和
阅读全文
摘要:SOJ 2818: QQ音速 问题:给出$4$个状态$1,2,3,4$以及状态之间转移的费用矩阵 $T=\left[\begin{array}{cccc}0 &1 &2 &2\\ 1 &0 &1 &1\\ 2 &1 &0 &2\\ 2 &1 &2 &0 \end{array}\right]$.现有两
阅读全文
摘要:SOJ 2142: Cow Exhibition 同样的题目可见:POJ 2184 问题:给出$n$个元素$node[i],1\le i\le n$,每个元素$node[i]$有两个属性smartness和funness.现在从这$n$个元素中找出一些元素$node[k], k\in S, S\su
阅读全文
摘要:SOJ 2801: 正方形 http://acm.scu.edu.cn/soj/problem.action?id=2801问题:给出一个$0-1$矩阵,找出只包含0的最大正方形并输出它的边长。 分析:这道题与最大子矩形(SOJ 3329)类似, 这里我们可以使用相同的方法(参考这里). 方法:(1
阅读全文
摘要:SOJ 3329: Maximum Submatrix II http://acm.scu.edu.cn/soj/problem.action?id=3329 问题:给出一个$0-1$矩阵,找出只包含0的最大子矩阵并输出其中0的个数。 方法: (1)动态规划 定义$dp[i][j], 1\le i\
阅读全文
摘要:SOJ 3085: windy's cake V http://acm.scu.edu.cn/soj/problem.action?id=3085 问题:给出$n$个正整数$num[1], ..., num[n]$, 定义从$i$到$j$的子列的分数为 $(\min_{i\le k\le j}num
阅读全文
摘要:SOJ 2511: Moooo http://acm.scu.edu.cn/soj/problem.action?id=2511 问题:给出$n$个元素$node[i], 0\le i<n$,每个元素$node[i]$有两个属性height和volume.对于每个$node[i]$,它的volume
阅读全文
摘要:SOJ 1162: I-Keyboard 问题:给出一个长度为$L$的字符串$S$,其中每个字符有个频数$F[i], 0\le i<L$.现在把$S$分成$K$段满足积和(sum of products)最小。对于每个段,其中的每个字符有个位置$P[i]$值从$1$到这个段的长度。 字符串: $S[
阅读全文
摘要:SOJ 3531: Number Pyramids http://acm.scu.edu.cn/soj/problem.action?id=3531 题意:首先介绍一个概念,由正整数构成的金字塔,从顶层往下依次是第1层,第2层,......,并且满足第i层有i个数。定义numer[i][j]表示第i
阅读全文
摘要:SOJ 3300: Stockholm Coins http://acm.scu.edu.cn/soj/problem.action?id=3300 题意:给出n个正整数num[i], 0≤i<n,求解一个最小的数,满足要通过求和得到该数必须用上所有的num[i](每个num[i]可以用任意次)。若
阅读全文
摘要:SOJ 3172: Fisherman http://acm.scu.edu.cn/soj/problem.action?id=3172 题意:给出n个数,从这n个数中选出任意一些求和,求解有多少种不同的和。 分析:考虑0-1背包模型,定义dp[i][j]为使用前i个数,和j是否存在,若存在则为1,
阅读全文
摘要:SOJ 2785: http://acm.scu.edu.cn/soj/problem.action?id=2785 题意:任意一个正整数都可以分解成2的幂次数之和,这里2的幂次数为集合{1,2,4,8,16,32,...}. 举个例子5, 5=1+1+1+1+1 5=1+1+1+2 5=1+2+2
阅读全文
摘要:我在之前讲过0-1背包和完全背包,这里讲多重背包。不同于0-1背包和完全背包,多重背包中每个物品有个给定的数量。假定背包容量为m,有n个物品,每个物品的重量为weight[i], 价值为value[i], 数目为num[i]. 显然,多重背包可以转化为0-1背包问题:将num[i]个物品i看作是nu
阅读全文
摘要:之前我讲过0-1背包,这里讲解完全背包。 一. 问题描述 假设我们给定n个物品,每个物品具有重量weight以及价值value,第i个物品的重量为weight[i], 价值为value[i]。同时给定一个容量为m的背包,求解背包里装入的物品价值之和的最大值。 不同于0-1背包问题(每件物品最多放入一
阅读全文
摘要:一. 问题描述 给定n个物品,每个物品有一个重量(也可以看作体积)weight[i]和一个价值value[i], 1≤i≤n。现有一个给定容量m的背包,求解背包里装入的物品价值之和的最大值。 二. 分析 定义dp[i][j]为:背包的容量为j并且放入前i个物品的最大价值。我们对第i个物品分析,存在两
阅读全文
摘要:SOJ 2293: The Longest SubSequence 题目意思很明白,找出能被给出的整数整除的最长的连续子段和,输出这个子段和的长度。算法思路很简单:对数组累计求和,然后利用模同余的思想。这里有个取模的trick注意一下,C++中一个负数$x$对一个正数$y$取模为负,例如$-9\%4
阅读全文
摘要:SOJ 4389: http://acm.scu.edu.cn/soj/problem.action?id=4389 题意非常简单:给定一个数组,找出过半的那个元素。刚开始我考虑从中位数入手,因为中位数一定是所求的答案。所以,利用快排找第(n+1)/2个元素,结果超时了。后来参考了别人的算法,这道题
阅读全文
摘要:SOJ 2222: Health Power http://acm.scu.edu.cn/soj/problem.action?id=2222 题目意思不难理解:给出需要的能量K以及F个食物(每个食物只能用一次),每种食物i具有能量HP[i]和分数score[i]。食物应该首先满足能量要求,然后从剩
阅读全文
摘要:SOJ 1093: 伊拉克 http://acm.scu.edu.cn/soj/problem.action?id=1093 题意:有m艘船,给出每艘船的长度。现在把这m艘船排成n行,每一行至少有一艘船。给出这n行每一行的长度,输出该行船的个数以及每艘船的长度。多种情况下,将长的的放在前面。 这道题
阅读全文
摘要:SOJ 1030: Sum It Up http://acm.scu.edu.cn/soj/problem.action?id=1030 题意不难理解,给出一个非递增序列和一个数t,从序列中找出所有的子序列满足之和等于t。序列中的数只能用一次并且不能出现重复的子序列。跟SOJ 1027相比这一道题有
阅读全文
摘要:SOJ 1027: Lotto http://acm.scu.edu.cn/soj/problem.action?id=1027 题意非常简单:给定一个序列,按字典序输出固定长度的所有子序列。标准的做法是回溯,因为题目中给出了固定长度为6,所以可以用6层循环暴力输出,代码如下: #include <
阅读全文
摘要:回溯算法最经典的问题是八皇后问题。题意很简单,给定一个n*n棋盘,放置n个皇后,满足任意两个皇后不能在同一行,同一列或者同一对角线上。显然,暴力算法可以求解这个问题。回溯算法相较于暴力算法的一个优点是从第一个状态开始,执行深度优先搜索,如果当前状态不满足,则立即停止并返回上一个状态。利用递归可以非常
阅读全文