上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 75 下一页
摘要: 原题链接 考察:矩阵快速幂 fw本f,想到了把f[i-1]拆开,但没想到只拆一个啊!!! 思路: \(f[i] = 2 \times f[i-1]+1\qquad(i为奇数)\) \(f[i] = f[i-1] + 2 \times f[i-2] +1\) \(f[i] = 2 \times f[i 阅读全文
posted @ 2021-06-07 12:19 acmloser 阅读(26) 评论(0) 推荐(0) 编辑
摘要: 原题链接 考察:贪心 本蒟蒻想的是线性dp,时间复杂度太高否了(.),然后又想不到正解. 思路: 参考了大佬的题解,就结果而言,最后要么是**?序列**0,1两极分布,要么是0,1混合分布. 对于混合分布,对于每一个相邻的?,要么是0,1要么是1,0.假设两个相邻?之间有s0个0,s1个1. 如果首 阅读全文
posted @ 2021-06-07 11:29 acmloser 阅读(39) 评论(0) 推荐(0) 编辑
摘要: 原题链接 考察:思维+并查集 思路: 对于每个棋子(x,y)我们尽可能把它们移到(x,x)或(y,y).我们尝试将(x,y)与(x,x),(y,y)连线.可以发现有些点成环了,并且成环的点破环环需要一步,破坏环后移回主对角线处又需要一步,其他点在破坏环后移到主对角线都只需要一步. 由此得出需要得到环 阅读全文
posted @ 2021-06-07 02:23 acmloser 阅读(64) 评论(0) 推荐(0) 编辑
摘要: 原题链接 考察:Trie+dfs 思路: 将每个数插入Trie中,可以发现如果子树的结点>=2,那么这些结点会内部连接,也就是说:如果左子树和右子树的结点都>=2,那么它们就是割裂的,我们需要删除一些点使得它们连接. 最少删除数 = 最大保留数.对于当前树u, 最大保留数 :f[u] =max(f[ 阅读全文
posted @ 2021-06-06 22:53 acmloser 阅读(54) 评论(0) 推荐(0) 编辑
摘要: 原题链接 考察:矩阵快速幂 思路: 就是密码设计那题的矩阵快速幂版.下面是密码设计的递推代码. for(int i=1;i<=n;i++)//已经构造了i个字符. for(int j=0;j<len;j++)//j是已经子串匹配了的位置 for(char k='a';k<='z';k++)//枚举密 阅读全文
posted @ 2021-06-06 21:21 acmloser 阅读(40) 评论(0) 推荐(0) 编辑
摘要: 原题链接 考察:线性DP 错误思路: 求出最长公共子序列再dfs回溯枚举长度. 错误原因: 不一定只存在一个最长公共子序列.比如样例2. 正确思路: 是dp(...),定义 f[i][j] 为以1~i,1~j构成的最长公共子序列的最大S值,且A子串以i结尾,b子串由j结尾.这里其实类似最大连续子段和 阅读全文
posted @ 2021-06-06 09:23 acmloser 阅读(36) 评论(0) 推荐(0) 编辑
摘要: 原题链接 考察:拓扑排序 思路: 等级低与等级高之间建立边.比如区间[1,6]之间停靠了(1,3,5,6).那么在(1,3,5,6)与(2,4)之间两两间加一条边.最后拓扑排序即可. 但是这样会TLE.时间复杂度O(109),空间复杂度极限O(500*500*1000).需要进一步优化. 但是注意初 阅读全文
posted @ 2021-06-06 08:57 acmloser 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 原题链接 考察:拓扑排序 思路: 求拓扑序列,然后从尾到头遍历每个点能到达的点,ans[u] |= ans[子结点1]|ans[子节点2]|ans[子节点3]... 因为需要用到或操作所以考虑位运算,如果每位每位或运算时间复杂度是O(nm),只能用bitset优化,bitset底部用int实现,将n 阅读全文
posted @ 2021-06-05 22:32 acmloser 阅读(33) 评论(0) 推荐(0) 编辑
摘要: 原题链接 考察:线性dp 思路: 二分求最长上升子序列板子题,我们可以发现二分求得的最长上升队列中,保存的就是当前长度最小的数字,因此我们只需要每覆盖一个存储它们前面一个,最后递归输出. ##Code #include <iostream> #include <cstring> #include < 阅读全文
posted @ 2021-06-04 19:18 acmloser 阅读(119) 评论(0) 推荐(0) 编辑
摘要: 原题链接 考察:线性dp 思路: 其实递推方程超简单,只是我蠢. if(s[i]>s[j]) dp[i]+=dp[j] else if(s[i]==s[j]) dp[i]-=dp[j]; 如果s[i]==s[j],那么dp[i]从前面<s[i]获得的子序列都要减去,因为与s[j]构成了重复. ##C 阅读全文
posted @ 2021-06-04 12:11 acmloser 阅读(323) 评论(0) 推荐(0) 编辑
上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 75 下一页