摘要: 背包问题 当范围很小的背包问题是很容易解决的,而当范围很大$(例如:1\le n\le 100,1\le w_i\le10^7,1\le v_i\le 100,1\le W\le 10^9)$时,就应该换一种 dp 的表示方式,这样才能够降低其复杂度。 $dp[i+1][j]$表示前 i 个物品中挑 阅读全文
posted @ 2020-01-14 19:38 caoanda 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 完全背包问题 $\begin{cases}dp[0][j]=0\\dp[i+1][j]=max(dp[i][j k w[i]]+k v[i]) \end{cases}$ 代码: cpp for(int i=0;i 同时出于节省内存的考虑,可以将其用一维数组表示 cpp for(int i=0;i=w 阅读全文
posted @ 2020-01-14 19:14 caoanda 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 最长公共子序列 注:子序列是可以不连续的。 递推公式: $dp[i+1][j+1]=\begin{cases}dp[i][j]+1&(s_{i+1}=t_{j+1})\\max(dp[i][j+1],dp[i+1][j])&(其 他)\end{cases}$ 代码: 阅读全文
posted @ 2020-01-14 18:19 caoanda 阅读(82) 评论(0) 推荐(0) 编辑
摘要: "C. Petya and Exam" 重要的事情说三遍!认真读题!认真读题!认真读题! 思维要开阔一点,不要被局限住了。 因为 t 很大,所以我们不能遍历 t,但是 n 只有1e5,所以我们可以遍历每道题的截止时间。然后在其多余的时间内尽可能多的做后面还没有做过的简单题,做完了再做难题。 对于这组 阅读全文
posted @ 2020-01-14 16:12 caoanda 阅读(174) 评论(0) 推荐(0) 编辑
摘要: "B. K for the Price of One (Hard Version)" 赛时失手推错了规律... 这个题不是单调递增的 但是它有一个规律:当买同样多的东西时,优先买便宜的 所以我们可以求出买 i 个东西时最便宜的价格 因为考虑到 n 只有2e5的范围,所以把每一个$dp[i]$都遍历一 阅读全文
posted @ 2020-01-14 12:26 caoanda 阅读(139) 评论(0) 推荐(0) 编辑