题目 分析 题目要求第i种颜色的最后一个珠子要在第i+1种颜色的最后一个珠子之前, 那么我们从小到大枚举做到第i种,把第i种的最后一颗珠子取出,将剩下的\(num(i)-1\)个珠子插入已排好的前i-1种中,再将取出的珠子放在最后一个. 每次求出将剩下的\(num(i)-1\)个珠子插入已排好的前i-1种中的方案数,将它乘以ans. 对于每个i的方案数可以用隔板问题来求. 但是,在比赛上,我忘了隔板问题,于是再枚举个j,将已经排好的珠子分成j份,将要放进去的的\(num(i)-1\)个珠子找出j…
题目描述 输入 输出 样例输入 3 2 2 1 样例输出 3 数据范围 样例解释 解法 先假定每种颜色的珠子取一个按顺序排列. 设这n个珠子就是每一种颜色的珠子的最后一个. 考虑逐个把珠子放入. 对于第i种颜色的珠子,计算有多少种摆放方式: 显然这种颜色最后的珠子前要放sum[i]-1个珠子,然后已放的有sum[i-1]个. 计算已放的珠子的位置有多少种方案,就等价于第i种珠子的摆放方案: 也即C(sum[i−1],sum[i]−1). 把所有颜色珠子的摆放方案乘起来即是答案. 代码 #incl…
题目 分析 易证,最优的答案一定是按\(w_i\)从小到大放. 我们考虑dp, 先将w从小到大排个序,再设\(f_{i,j}\)表示当前做到第i个物品,已选择了j个物品的最大值.转移就是\[f_{i,j}=max\left\{\begin{array}\\f_{i-1,j}\\f_{i-1,j-1}+v_i-w_i*(共选多少个物品(这个要枚举)-j)\end{array}\right.\] 但显然这是\(O(n^3)\)的. 我们考虑如何不用枚举共选多少个物品, 我们考虑反过来做,将w从大到小…
题目 描述 题目大意 一个序列,每次可以使一段区间内的所有数加一(模四). 问最少的操作次数. 思考历程 一看这题目,诶,这不就是那道叫密码锁的题目吗? 然后随便打一打,样例过了,就再也没有思考这一题. 正解 其实我的想法完全错了. 因为这题只能加,不能减啊! 于是就得考虑另一个方法. 题目可以转成这样的问题:给你一个数列,你可以预先给其中的数加四,然后每次对一个区间进行减一操作,问最少的操作数. 显然,如果已经加四了,就是一道大水题(好像叫--粉刷栅栏)? 我们先不考虑加四,那么答案就是∑ma…
题目 描述 题目大意 有nnn个人,你要确定一个出场序列.每次新上台的人就会和擂主打一架,胜利的人继续当擂主.题目给出两两之间打架胜利(失败)的概率. 问111选手坚持到最后的最大概率. 思考历程 看这数据范围这么小,立即想到状压DP! 自然而然地想到状态:设fs,if_{s,i}fs,i​表示上了台的人的状态为sss,当前擂主为iii的最大概率. 于是我很快就发现了这个方法的bug.每次转移都会有输或硬两种状态,但万一它们以后要合并到一起呢? 假设状态AAA转移到状态BBB和CCC,接下来状态…
题目 描述 题目大意 给你一堆小串,每个小串都有一定的分数. 让你构造一个字符串,若子串中出现了之前的小串,就可以得到对应的分数(可以重复) 问最大分数. 思考历程 一看这题就知道是什么字符串方面的算法. 然后就很自然地想到AC自动机,多串匹配嘛! 接下来就想到建字符串的过程中,一个指针在AC自动机上跳来跳去-- 先建出AC自动机,然后算出到达每个节点的贡献. 对于每个节点,枚举字母,若没有出边,就想着用failfailfail往上跳,然后将出边连向那个地方. 从此AC自动机变成了一张有向图,每…
题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表示第i行状态为j的方案数: f[i][j]=sum(f[i−1][k])(其中j可以从k中转移过来) 预处理出所有转移合法的情况. 然后矩阵乘法优化即可. 代码 #include<iostream> #include<stdio.h> #include<math.h> #i…
题目 分析 首先用\(a_i\)表示达到目标的步数\(B_i-A_i(mod 4)\) 根据粉刷栅栏,先不管mod 4的情况,答案就是\(\sum\max(a_i-a_{i+1},0)\) 那我们刚才做个差分\(a_i-=a_{i+1}\) 当我们给i增加高度, 那么\(a_i-4,a_{i+1}+4\) 当我们给区间增加高度,那么因为中间的+4-4抵消了,所以 \(a_l-4,a_r+4\) 那么我们考虑 \(a_l\)为1.2.3的情况, 就读者私下讨论. #include <cmath>…
第一题,典型的隔板问题, 但是我忘记隔板问题怎么打,一开始在花了1小时,还是没想出来,果断弃疗, 最后的40分钟,我打完了第二题,接着又用了20分钟推敲出一种极其猥琐的式子来代替,可惜预处理的阶乘忘记mod,只拿了40分. 好伤心,60分就这样飞走了(:′⌒`) 第二题很像多米诺骨牌,于是就找规律,找了半天都没有发现, 于是考虑打60分dp,然后转念一想,dp不就是个递推式吗,然后就用矩阵快速幂搞到了100分. 第三题有点坑爹,考虑了dp.贪心,最后还是失败了. 正解是类似于粉刷栅栏的神奇贪心.…
题目 分析 设表示每一行的状态,用一个4位的二进制来表示,当前这一行中的每一个位数对下一位有没有影响. 设\(f_{i,s}\)表示,做完了的i行,其状态为s,的方案数. 两个状态之间是否可以转移就留给读者自己思考了. 答案就是\(f_{n,0}\)因为最后一行对下一行不能造成影响. 然而,这样只有60分. 100分是个矩阵快速幂, B矩阵构造很简单,当两个状态\(s.s'\)可以转移,那么,B矩阵\(g_{s,s'}=1\). 当i等于零时, A矩阵为{1, 0 \(<\)repeats 15…