随笔分类 -  ICPC-动态规划

摘要:题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种 分析 : 完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的 故状态转移方程为 dp[i] += dp[j-w[i]] 但是这题怎么可能那么简单呢! N 和 K 的上限导致答案过大,需要使用高 阅读全文
posted @ 2017-12-29 12:39 qwerity 阅读(124) 评论(0) 推荐(0)
摘要:题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁。不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别。从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法。 分析 : 实际就是要解决 => 从 n 种物品中取出 m 个有多少种取法 ( 同种无法区分 ) 计数问题的 D 阅读全文
posted @ 2017-12-29 12:32 qwerity 阅读(268) 评论(0) 推荐(0)
摘要:题意 : 给出一个由 n 中字母组成的长度为 m 的串,给出 n 种字母添加和删除花费的代价,求让给出的串变成回文串的代价。 分析 : 原始模型 ==> 题意和本题差不多,有添和删但是并无代价之分,要求最少操作几次才能是其变成回文串 ① 其实细想之后就会发现如果没有代价之分的话删除和增添其实是一样的 阅读全文
posted @ 2017-12-27 21:33 qwerity 阅读(129) 评论(0) 推荐(0)
摘要:题意 : 有两颗苹果树,在 1~T 的时间内会有两颗中的其中一颗落下一颗苹果,一头奶牛想要获取最多的苹果,但是它能够在树间转移的次数为 W 且奶牛一开始是在第一颗树下,请编程算出最多的奶牛获得的苹果数 分析 : 这题是不可能爆搜的,可组合的情况实在太多....... 定义 dp[ i ][ j ] 阅读全文
posted @ 2017-12-26 23:41 qwerity 阅读(128) 评论(0) 推荐(0)
摘要:题意 : 给出一个数 n ,问如果使用 2 的幂的和来组成这个数 n 有多少种不同的方案? 分析 : 完全背包解法 将问题抽象==>有重量分别为 2^0、2^1、2^2…2^k 的物品且每种物品可无限取,问有多少种方案来填满容量为 n 的背包? 之前并不知道背包还能用来计数....... 有一道裸的 阅读全文
posted @ 2017-12-26 15:28 qwerity 阅读(345) 评论(0) 推荐(0)
摘要:题意 : 设 NUM 是一个 n 位十进制整数。如果将 NUM 划分为 k 段,则可得到 k 个整数。这 k 个整数的乘积称为 NUM 的一个 k 乘积。试设计一个算法,对于给定的 NUM 和 k,求出 NUM 的最大 k 乘积 分析 : 定义 dp[i][j] = 前 i 个数字中间插入 j 个乘 阅读全文
posted @ 2017-12-21 19:20 qwerity 阅读(1921) 评论(0) 推荐(0)
摘要:题意 : 有 n 种面额的硬币,给出各种面额硬币的数量和和面额数,求最多能搭配出几种不超过 m 的金额? 分析 : 这题可用多重背包来解,但这里不讨论这种做法。 如果之前有接触过背包DP的可以自然想到DP数组的定义 ==> dp[i][j] 表示使用前 i 种硬币是否可以凑成面额 j 。 根据这样的 阅读全文
posted @ 2017-12-17 20:30 qwerity 阅读(170) 评论(0) 推荐(0)
摘要:题意 : 题目链接 分析 : 听队友说一般概率从前往后推、期望从后往前推......... #include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; double dp[maxn], sumdp[maxn]; in 阅读全文
posted @ 2017-11-15 19:36 qwerity 阅读(227) 评论(0) 推荐(0)
摘要:题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 分析 : 有两种做法,如果会拓展KMP的话可以说这就是一道模板题了,拓展KMP专门就是找最长公共前缀 阅读全文
posted @ 2017-09-22 21:48 qwerity 阅读(168) 评论(0) 推荐(0)
摘要:题意 : 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。例如:S = "abababa" 所有的前缀如下: "a", 长度与出现次数的乘积 1 * 4 = 4, "a 阅读全文
posted @ 2017-09-22 21:06 qwerity 阅读(258) 评论(0) 推荐(0)
摘要:问题描述 : 在一个给定的无序序列当中找出最长且递增的子序列 (不一定连续) 对于这个经典问题通常有两种时间复杂度不一样方法来解决一个是O(n2)的算法 另外一个是采用了二分或树状数组O(nlogn)的算法。 动态规划 O(n2) 算法 : 对于序列 squ[1]、squ[2]……squ[n] 分别 阅读全文
posted @ 2017-09-13 17:05 qwerity 阅读(461) 评论(0) 推荐(0)