![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
每日一题
Y.IU.
悄悄努力,然后惊艳所有人。
展开
-
(力扣每日一题)单词搜索 II(字典树+DFS)
题目链接:力扣https://leetcode-cn.com/problems/word-search-ii/ 大意:给出一个m*n的二维字符网格和一个字符串列表,定义在网格中出现的单词为,由相邻单元格的字母组成,问有多少个单词既出现在字符串列表,又出现在网格内。 思路: 首先网格中的字符串可以由DFS得到,但是如何判断是否出现在字符串列表中呢,如果直接枚举判断的话,O(n*m*words.size()),T掉了。 优化,引入字典树,字典树可以存储以某一段字符串为前缀的字符有多少个,将字符串列表中的原创 2021-09-16 17:09:40 · 154 阅读 · 0 评论 -
【每日一题】涂色PAINT
涂色PAINT:区间dp https://ac.nowcoder.com/acm/problem/19909 思路:和取数游戏一样设置dp状态。 设置状态:表示区间涂[i,j]需要的最少次数。 状态转移: 如果s[i] = s[j],那么在涂[i+1,j]的时候和在涂[i,j-1]的时候可以一起把s[i]或者s[j]涂上。所以 如果s[i] != s[j],分成两段来求,那么我们枚举[i,j]里面的每个点,假设为k,那么 赋初值:当i=j的时候dp[i][j] = 1. #include.原创 2021-03-27 12:13:22 · 368 阅读 · 0 评论 -
【每日一题】矩阵取数游戏
矩阵取数游戏:动态规划 https://ac.nowcoder.com/acm/problem/16645 思路:如果只有一行的话,题目在这,现在是n行,那么就对每一行求取完这一行得到的最大值是多少。 单独一行怎么求? 动态规划分三步走: 找状态:dp[i][j]表示取完下标i-j所能得到的最大值是多少。 状态转移:。 为什么这样转移呢?因为i-j可以先取左边,那么最大值不就是(i+1)-j的最大值乘取掉最左边的值吗?同理取右边也是一样的。 赋初值:。 因为状态是由小区间向大区间扩展,所有原创 2021-03-27 10:31:39 · 325 阅读 · 0 评论 -
【每日一题】排座椅
排座椅:贪心+排序 https://ac.nowcoder.com/acm/problem/16618 思路: 1)先单独看左右相邻的情况。贪心策略就是优先把某一列对数多的相邻两列插入一个纵向通道,所有统计每列上有多少对,按这个排好序后然后再去出l个按下标排序,最后就是纵向通到的答案。 2)同理上下相邻也是一样的。 #include <bits/stdc++.h> #define ull unsigned long long #define ll long long const in原创 2021-03-25 21:29:50 · 204 阅读 · 0 评论 -
【每日一题】追债之旅
追债之旅:最短路 https://ac.nowcoder.com/acm/problem/14700 思路:这题不是单纯的求1-n的最短路,而是求1-n种路径花费和+挥霍费和最小,所有我们修改dis[n]位dis[n][k],表示花费k天到到1-n的最小花费,同时标记数组为vis[n][k]。同样跑Dijktsra即可。 #include <bits/stdc++.h> #define ull unsigned long long #define ll long long const i原创 2021-03-25 20:19:17 · 88 阅读 · 0 评论 -
【每日一题】乌龟棋
乌龟棋:记忆化搜索 https://ac.nowcoder.com/acm/problem/16590 思路:看数据范围是350,每一步的选择有四种,可以采用dp递推,也可以记忆化搜索。 记忆化搜索:设置状态dp[a][b][c][d] 表示用了a个1,b个2,c个3,d个4的最优解。 然后对于每一步搜索四种情况 #include <bits/stdc++.h> #define ull unsigned long long #define ll long long const int原创 2021-03-25 12:16:05 · 102 阅读 · 0 评论 -
【每日一题】联合权值
联合权值 https://ac.nowcoder.com/acm/problem/16495 思路: 两个点能够存在联合权值,满足两者间的距离位2,也就是他们直接有一个共同点,如u-t-v,所以u,v存在联合权值。 再通过图可以发现,其实也就是某个点的孩子节点之间两两存在联合权值,所有我们枚举每个点,通过它的孩子节点求联合权值。 一个点的孩子节点间的联合权值最大一定是孩子节点中权值第一大和权值第二大的节点的权值乘积。所有就是求孩子节点中权值最大和权值第二大的乘积是多少。 孩子节点联合权值和可以都原创 2021-03-25 11:06:17 · 221 阅读 · 0 评论 -
【每日一题】The XOR Largest Pair
The XOR Largest Pair:字典树 https://ac.nowcoder.com/acm/problem/50993 经典字典树求n个数中任意两个数的异或值最大。 思路:利用32位二进制位构建字典树。然后我们知道异或值是相同位0,不同为1,所以对于每个数取遍历字典树,如果这个数的某位取反在字典树上是存在的话,则进入这个分支,否则则按原路走。更新得到最大值即可。 k = (x>>i)&1;注意不能写成k=((1<<i)&x),因为我们要取得是1/原创 2021-03-24 19:30:10 · 414 阅读 · 0 评论 -
【每日一题】筱玛爱线段树
筱玛爱线段树:前缀+后缀差分 https://ac.nowcoder.com/acm/problem/25737 思路:单纯看操作一得话,可以只用一个前缀差分就可以做,加入操作二得话,也可以用差分来求第i次操作执行多少次,但是因为如果某次操作时类型二,而且在这之前又有操作二类型,那么之前得操作又会受到影响,所有我们选择从后往前进行操作,这样就不存在后效性。 #include <bits/stdc++.h> #define ull unsigned long long #define ll原创 2021-03-24 17:56:32 · 78 阅读 · 0 评论