- 博客(12)
- 收藏
- 关注
原创 牛客butterfly
我们可以预处理出来左下,右下,向下的子符串最大延伸长度。a[i][j]为(i,j)向右下延伸的最长距离。c[i][j]为(i,j)向左下延伸的最长距离。根据题意我们能知道:这道题直接做是不太好做的。b[i][j]为(i,j)向下延伸的最长距离。
2023-10-10 11:22:24
49
1
原创 Fancy Signal Translate
举例来说:比如i=3,2的i次方为8,就是位数为3的八种字符串,000,001,011,010,100,101,110,111.如果个数小于8,说明有没有出现过的01串。这道题其实就是求组成01字符串,最短的并且不是给出的01字符串的子串的长度。比如说:10010,如果使11就没有重复的 但是00,01,10就是重复.2如果长度为i的子串个数小于2的i次方,说明可行。1<<i位运算,1左移i为,其实就是计算2的i次方。1.可以用set容器存储子串。
2023-10-09 23:13:36
51
1
原创 CCC单词搜索
这道题其实就是枚举,对于八个方向的枚举,但是每一步还要考虑转弯不转弯的情况。转弯情况:一个单词最多6个,不转弯一种情况,转弯(6-1)*2个情况。当i=0的时候,第三位不变,等于1的时候第三位异或运算。时间复杂度:100*100*8*(5*2+1)数量级为1e6 不超过1e8 不会TLE。遍历起点:R*C=100*100。八个方向就可以用偏移量来表示。
2023-09-28 22:15:07
51
1
原创 小明打联盟(背包dp问题)
题目要求我们算出T时间内打出的最高伤害,等于完全背包问题(每个物体有无数个 可以放多个相同的物体)再进一步优化f[j]=max(f[j],f[j-v[i]]+w[i]);重点:集合划分:第i个元素选择几个。我认为最重要的还是集合划分。由此可以知道k循环可以不要。具体可以看看另外一篇博客。这道题是动态规划问题。
2023-09-04 19:14:20
61
1
原创 快乐子数组(二重前缀和+单调栈)
这里可以列出一个式子:w[i+1](j-(i+1))+w[i+2](j-(i+2))....+w[j-1](j-(j-1)) 这个地方边界就是j-1所以到j-(j-1)就结束。设A为前缀和, 即找到第一个比A[i]小的数A[k], 这样从i+1到k-1之间的数就是一个快乐连续子数组。第一个式子减去上面这个式子得到:相差(A[j-1]-A[i])*(n-j);假设j是快乐子数组的右端点 i是左端点 那么A[j]-A[i-1]>=0;
2023-08-30 19:44:10
38
1
原创 贪心算法部分区间题目详解
2.从前往后处理每一个区间:如果现在要处理的区间的左端点大于当前组最后边的右端点,就可以直接加进去;如果现在要处理的区间的左端点小于当前组最后边的右端点,就重新开一个组;根据题意:如果两个没有相交的部分就放在一组。1.我们先把区间按左端点把所有区间排好队。注:为什么不能右端点。
2023-07-22 23:14:40
58
1
原创 状态压缩DP
(简称状压DP)也是一种很特殊的 DP 算法,其精髓就是将所有物品的状态(一般是选或不选,用01表示,当然也有特殊情况)压缩成一个整数,进行状态的转移并节约空间。所以状态表示f[i][j]:表示已经将前 i -1 列摆好,且从第i − 1 列,伸出到第 i 列的状态是 j 的所有方案。假如i-2列和i-1列放的小方块和i-1和i列放的有重复的地方(如图中红绿相交的情况)就会产生冲突!我们可以来分析一下i-2和i-1与i-1和i列的状态转换关系;核心:我们的方案数==横着放的小方块数量。
2023-07-17 20:19:14
68
1
原创 动态规划——线性DP(部分)
状态表示:f[i]表示从第一个数字开始算,以w[i]结尾的最大的上升序列。所以f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);step1:状态表示,这里我们用二维来表示 f[i][j] :a[i],b[j]的公共子序列的全部集合;根据题干我们可以先把你要求到(i,j)这个点的最大值的左上和右上的最大值求出来再加这个终点的值。状态计算(集合划分):j∈(0,1,2,..,i-1), 在a[i] > a[j]时,注意:f[i-1][j-1]+a[i][j]
2023-07-16 21:52:36
65
1
原创 背包问题(四类)
第一部分选了第i个元素:其实就是在i-1个里面选择体积不超过j-v[i]的最优解再加上第i个元素的价值,由此得到公式:f[i][j]=f[i-1][j-v[i]]+w[i];第二部分: 不选第i个就是在i-1个里面选择不超过j的最优选,由此得到公式发f[i][j]=f[i-1][j];最后得到公式:f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);2.集合划分:这道题我们可以把大的集合划分为两个部分:(1)选择第i个元素(2)不选择第i个元素。
2023-07-15 19:35:20
142
1
原创 最大公约数
若d是(b,a%b)的公约数 则知 d|b 且 d|a-k*b 则 d|a-k*b+k*b = d|a 故而d同时整除a和b 所以d也是(a,b)的公约数。若d是(a,b)的公约数 则知 d|a 且 d|b 则易知 d|a-k*b 故d也是(b,a%b) 的公约数。因此(a,b)的公约数集合和(b,a%b)的公约数集合相同 所以他们的最大公约数也相同 证毕#设a%b = a - k*b 其中k = a/b(向下取整)则有 gcd(a,b) = gcd(b,a%b)
2023-07-12 23:25:22
35
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人