摘要: 题目POJ 棋盘问题POJ 炮兵阵地POJ Painting a BoardPOJ Relocation思路1. 状态压缩题目数据量在某一维度会比较小, 当看到二维数组的某一行或某一列比较短时, 就应该想到状态压缩. 一般来讲, 用 PUSH 操作更多2. 第一题 棋盘问题. 每一行每一列只能放一个棋子. dp[i][state] 表示前 i 行放棋子后得到的状态为 state 时的方案数. dp[i][state] = sum(dp[i-1][oldstate])3. 第二题 炮兵阵地. 每一行能够安放的炮台数是一定的. 一门大炮的攻击范围为 2, 所以状态需要记录前两行的. dp[i][s 阅读全文
posted @ 2014-03-23 14:30 周卓 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 题目Ghost Blows LightTELERebuidling RoadsBribing FIPAApple TreeContestants Division思路1. 树形 DP 动规数组的设置方法一般为 dp[u][i], u 为根节点, i 为可枚举的量(资源, 收益都有可能)2. 树形 DP 一般都是多叉树转二叉树, 若孩子节点之间的地位不平等, 则 dp[u][i] 需要添加额外的维3. 代码框架是 dfs 进行后序遍历, dfs(int pre, int u, int K)4. 第一题 鬼吹灯. 经典树形 DP. dp[u][i] 表示在以 u 为根的节点花费 i 的时间最后回到 阅读全文
posted @ 2014-03-23 14:29 周卓 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 题目两船载物POJ Find the Multiple九度 棋牌寻宝扩展The fewest CoinsEuro EfficiencyMargarits on the River Walk思路1. 第二题在编程之美上以例题的形式给出, 书上给出的解法是剪枝. 这边是把只含01的数变成 1 + 10 + 100... 的问题dp[i][j] 表示前 i 个数组成的mod n 余数为 j 的最小值dp[i][j] = min(dp[i-1][j], dp[i-1][r]+10^i)2. 第四五题类似. 找零问题. dp[i] 表示支付 i 钱需要的最少货币数. dp[v] = min(dp[v-w 阅读全文
posted @ 2014-03-23 14:28 周卓 阅读(421) 评论(0) 推荐(0) 编辑
摘要: 题目Leetcode Word BreakPOJ Bracket Sequence思路1. 都是 DP 之后打印路径. 打印路径的必要信息在 DP 过程中被记录2. 第一题. 使用向量记录第 i 个位置上有几个可选单词, 最后用 DFS 摘取3. 第二题. dp[i][j] 表示 string[i...j] 之间形成合法序列需要添加的最少的括号数, choose[i][j] 则表示这个区间在哪切割最合适.当区间不需要切割时, choose[i][j] 为 0, 否则 choose[i][j] 为切割位置利用 choose 递归打印路径那一段, 非常经典 阅读全文
posted @ 2014-03-23 11:51 周卓 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 题目Leetcode Palindrom CutLeetcode PalindromBrackets Sequence矩阵链乘法 阅读全文
posted @ 2014-03-23 11:47 周卓 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 题目Leetcode Edit DistanceLeetcode Interleaving StringLeetcode Distinct Subsequence思路1. 共性: 基于最后一位是否相同来决定递归函数的走向2. 第一题. dp[i][j] 表示 str1[0...i], str2[0...j] 之间的距离 dp[i][j] = dp[i-1][j-1] if str1[i] == str2[j] dp[i][j] = min(dp[i-1][j], dp[i-1][j-1], dp[i][j-1]) else3. 第二题. dp[i][j] 表示 str1[0...i] 能否.. 阅读全文
posted @ 2014-03-23 11:46 周卓 阅读(741) 评论(0) 推荐(0) 编辑
摘要: 题目POJ Help JimmyFloydWarshall 算法 阅读全文
posted @ 2014-03-23 11:44 周卓 阅读(81) 评论(0) 推荐(0) 编辑
摘要: 题目POJ Balance九度 出入栈POJ Communication SystemFind the multiple思路1. 共性: dp[i][j] 中第二个变量 j 并不明确.2.第一题. dp[i][j] 表示放入第 i 个秤砣后平衡系数为 j 的方案数j 的范围位置, 因此使用 PUSH 更好dp[i][j+weight[i]*dist] += dp[i][v]3. 第二题 出入栈dp[i][j] 表示前 i 个操作序列中入栈操作个数为 j 的方案数dp[i][j] = dp[i-1][j] + dp[i-1][j-1] 枚举最后一位是入栈还是出栈4. 第三题 交流系统. dp[i 阅读全文
posted @ 2014-03-23 11:43 周卓 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 题目POJ Post Office九度 买卖股票九度 项目安排POJ Lazy WorkerLeetcode Word Break九度 座位问题思路1. 第一二道题是二维DP, 第三四道题是一维DP, 但是大体上来看, 思路是相同的2. 四道题的公共特征是: i 是物品, j 是数量, dp[i][j] 可以是方案数, 也可以是最值; 当最外层循环到 i 时, 需要做出选择, 不同的选择代价不同; 都有枚举的过程; j 是比较明显的可以枚举的量, 题目往往会给 j 设置个上限3. 第一道题, dp[i][j] 表示前 i 个村子放 j 个邮局的最小距离. dp[i][j] = min(dp[k 阅读全文
posted @ 2014-03-23 11:40 周卓 阅读(181) 评论(0) 推荐(0) 编辑