摘要: 传送门 解题思路 我们发现到某一位时,前面擦去那些数字并不影响当前位,影响的只有前面擦去的数量。 设dp[i][j]表示到第i个数共擦去j个数的答案。 则dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]+(i-j==a[i])); 最后答案就是max(dp[n][j])。 A 阅读全文
posted @ 2021-09-26 16:54 尹昱钦 阅读(41) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 本题从暴力dfs入手,推出dp转移方程。 先进行排序,速度越大编号越大。 假设齐王从最大开始的出马,dfs(now,l,r)表示齐王出到编号为now的马,田忌还剩下l-r之间的马(因为田忌一定是要么出最大的马,要么出最小的马)。 分类讨论,当田忌最大的马大于齐王,则一定拿下这场比赛 阅读全文
posted @ 2021-09-26 16:31 尹昱钦 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 今天拿下好几发最优解,对卡常有了很大的感悟。 尽量少用数组访问地址不连续的值,尽可能用单个变量在求解的for循环中读入并求解。 stl不开O2是真的慢,手写封装的数据结构也是蛮好看的。 取模运算非常慢,如果开long long可以少取几次模,那非常划算。 阅读全文
posted @ 2021-09-26 15:08 尹昱钦 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 洛谷传送门 解题思路 把有馅的面包的数量看做ai/ci,就转化成了多重背包的板子。 为了练习熟练度,于是使用单调队列优化多重背包。 本以为肯定是最优解,没想到竟被一个直接暴力拆成01背包的干翻了。。 不能放弃,于是就手写双端队列,再交了一遍,把它干翻了,拿到了最优解。 AC代码 #include<c 阅读全文
posted @ 2021-09-26 15:05 尹昱钦 阅读(47) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 首先可以发现,无论怎么变,字母的和是不变的。 而且每个位置是多少都行(只要和别超)。 用dp[i][j]表示前i位的和为j的方案数。 然后枚举第j位可能情况(0~25),从dp[i-1][j-k]转移过来即可。 一种思路是先预处理这个dp数组,然后回答询问。 另一种思路是离线处理, 阅读全文
posted @ 2021-09-26 09:32 尹昱钦 阅读(46) 评论(0) 推荐(0) 编辑
摘要: 洛谷传送门 解题思路 先用类似dp预处理出is[l][r]表示l到r这个区间是不是回文串。 然后在把is数组放到二维平面上,每次询问l,r实际上就是询问(l,l)到(r,r)这样一个矩阵的点的数量。 可以用二维前缀和处理出来,O(1)查询。 AC代码 #include<cstdio> #includ 阅读全文
posted @ 2021-09-26 08:36 尹昱钦 阅读(39) 评论(0) 推荐(0) 编辑
摘要: 洛谷传送门 解题思路 最朴素的 dp 为:\(dp_{i,j}\) 为前 \(i\) 个数选 \(j\) 个方案数。 \(O(n^2)\) 的时空复杂度,很显然会炸,所以需要优化。 先考虑空间,第一维可以滚动数组滚掉,因为选的第 \(j\) 个数与上一个数是什么没关系。 再考虑时间上,尝试对于每个 阅读全文
posted @ 2021-09-26 07:24 尹昱钦 阅读(41) 评论(0) 推荐(0) 编辑
摘要: 偶然学到了对拍的正确打开方式。 当然不只限于对拍,也可以偷懒用来测试样例。 首先应该写一个对拍程序: for(int i=1;i<=300;i++){ system("数据生成.exe > data.txt"); system("正解.exe < data.txt > ans.txt"); syst 阅读全文
posted @ 2021-09-26 06:18 尹昱钦 阅读(49) 评论(0) 推荐(0) 编辑