摘要:
原题链接 考察:贪心 大水题. 思路: 排序,从后往前加.每三个加一个最后的. 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 阅读全文
摘要:
原题链接 考察:区间dp 递推思路: 套区间dp模板,划分集合的时候分为增加或者减少 f[i][j]为当前区间为[i,j]时变为回文串的最小花费. 就和密码脱离那道题差不多,if s[i] = s[j] f[i][j] = f[i+1][j-1]. else f[i][j] = min(f[i+1] 阅读全文
摘要:
原题链接 考察:记忆化搜索 错误思路: 将f[i][j]定义为达到此点的最大分数,结果是TLE. 正确思路: 和滑雪那道题一样,要将f[i][j]定义为从mp[i][j]出发的最大分数. 应该考虑记忆化搜索的优化原理是搜过一次就不要再搜 1 #include <iostream> 2 #includ 阅读全文
摘要:
原题链接 考察:记忆化搜索 错误思路1: 数组记录x与y的值,如果重复出现就判死循环. 审题,只有当x的值与操作在此前出现过才是死循环,y的值不影响循环,而单凭x的值也不能判死循环.因为可能进行的操作会不同.所以根据x与下一个操作才能判定一个状态. 错误思路2: for循环i-1遍,用bool数组记 阅读全文
摘要:
原题链接 考察:树形dp 思路: 设f[i][j]表示和为i,j==1表示经过了>=d的边,j=0表示未经过的方案数.以最后一步来划分集合,最后一步的和为i-j,此时边为j,那么状态转移方程是: if(j>=d) f[i][1] = f[i-j][0]+f[i-j][1] else f[i][1] 阅读全文
摘要:
原题链接 考察:记忆化搜索 思路: dfs模拟即可,用map判断当前数字出现过几次.但是回溯的时候要注意,如果本该有的数字没有说明被凑成了一对,但是恢复要恢复成1,如果有就要去掉这个数字. 本蒟蒻真的写得很繁琐,这位大佬利用位运算0 1的性质避免了判断2,很妙 GO 网上题解基本都用了步数作为参数, 阅读全文
摘要:
原题链接 考察:记忆化搜索 太菜了太菜了,说实话本蒟蒻完全没看出来为什么要用记忆化搜索.T了两次算了搞明白了点. 假定数据: a = aaa,b = aaa, c = aaaaaw. 很容易看出答案是错的,但是dfs会不断搜索,在返回的时候,用了b一个字符会在优先使用a一个字符.而此状态被搜索过,因 阅读全文
摘要:
原题链接 考察:记忆化搜索 15min内WA 6次,不愧是我 思路: 按题目意思走即可. 坑点: 记忆化数组的n必须开很大,否则WA.因为在m>0&&n>0内,m每减一次1,n就要累加一次和. 可能要开long long, 1 #include <iostream> 2 #include <cstr 阅读全文
摘要:
原题链接 考察:记忆化搜索 思路: 可用递推和记忆化搜索两种方式. 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 const 阅读全文
摘要:
原题链接 考察:树形dp+约数 思路: 预处理约数之和,用倍数法,时间复杂度10^6次方左右,sum[i]<i的建立边.通过打表可知是不止一棵树,也就是数字建立的图是森林.对于遍历过的点标记一下,没标记的遍历即可.最后就是求树的直径. 倍数法中:j枚举了i的倍数 1 #include <iostre 阅读全文