
动态规划
youth.lin
a tyro at CS and NLP.
展开
-
POJ 3624 Charm Bracelet(0-1背包的动态规划!)
原题地址:http://poj.org/problem?id=3624 0-1背包问题描述如下: 有一个容量为M的背包,和N个物品。这些物品分别有两个属性,体积w和价值v,每种物品只有一个。要求用这个背包装下价值尽可能多的物品,求该最大价值,背包可以不被装满。 因为最优解中,每个物品都有两种可能的情况,即在背包中或者不存在(背包中有0个该物品或者 1个),所以我们把这个问题称为0-1背原创 2017-04-29 21:10:10 · 579 阅读 · 0 评论 -
HDU 1114 Piggy-Bank(完全背包动态规划+变形)
原题地址http://acm.hdu.edu.cn/showproblem.php?pid=1114 题意:给定一个存钱罐的重量M,已知里面存放的货币种类可能有N种,每种货币都有重量w和金额v,求该存钱罐里存放的最少金额(存钱罐必须装满)。解题思路最近在复习背包问题,在上一题里复习了【0-1背包的动态规划】,这一题来复习完全背包的动态规划解法,但是这一题不是裸题,有两处变形。首先看完全背包的经原创 2017-04-30 17:33:55 · 414 阅读 · 0 评论 -
PAT 1007 Maximum Subsequence Sum(最大子串和)
原题地址https://www.patest.cn/contests/pat-a-practise/1007 求出给定数字串的最大子串和,以及这个最大子串和的首尾元素。(若有多个最大子串则取最靠左的那个)解题思路本题基本上是最大子串和的裸题,只是增加了一个输出首尾元素的要求。最大子串和描述:输入一个整数序列,求出其中连续子序列和的最大值。最大子串和几种解法:复杂度O(n^3):穷举所有可能原创 2017-05-10 19:03:21 · 1542 阅读 · 0 评论 -
动态规划-经典题型
最少找零数 给定面值为v[0], v[1]…v[n-1]元的硬币若干,如何用最少的硬币凑够total元?状态:dp[i]表示凑够 i 元需要的最少硬币数状态转移方程:dp[i] = min { dp[ i-v[j] ]+1},其中i >= v[j],j=0..n-1。const int maxn = 100, INF = 1 << 27;void dp_coin() //动态规划求最少找零数量原创 2017-07-01 10:11:23 · 344 阅读 · 0 评论 -
POJ 1159 Palindrome(最长回文子序列+滚动数组)
题目https://vjudge.net/problem/POJ-1159(POJ崩了,题目参照VJudge里的) 题意:给定一个字符串,求最少需要插入多少字符,使其成为回文串。如Ab3bD最少需要插入2个字符。解题思路要使插入的字符最少,那就要尽可能利用原字符串中的最长回文子序列。求出了最长回文子序列的长度,用原串长度减去它即答案。将输入串s逆序,得到s2求s和s2的最长公共子序列LCS原创 2017-07-02 16:21:20 · 480 阅读 · 0 评论 -
POJ 2533 Longest Ordered Subsequence(最长上升子序列DP)
原题地址http://poj.org/problem?id=2533 最长上升子序列问题:有一个长为n的数列,请求出这个序列中最长的上升子序列的长度。上升子序列指的是对任意的i < j都满足ai < aj的子序列(注意和子串的区别)。解题思路本题是最长上升子序列(Longest Increasing Sequence, LCS)的裸题,用动态规划求解最为方便。O(n^2)的DP解法定义dp[i原创 2017-04-30 22:54:43 · 359 阅读 · 0 评论 -
EOJ 3302 打印(动态规划)
题目http://acm.ecnu.edu.cn/problem/3302/ 题意:打印 n 个相同的字符,插入或删除一个字符花费的时间为 x,复制当前整个文本并且粘贴在后面的时间花费为 y,求完成 n 个字符的打印所需的最小花费时间。解题思路一开始想用BFS做,但考虑到可以删除字符,因此搜索空间可能会很大导致TLE,改用DP。用数组dp[i]来记录打印 i 个相同字符所需的最小花费时间,那么原创 2017-09-04 09:46:04 · 1196 阅读 · 4 评论 -
EOJ 2857 编辑距离(动态规划)
题目http://acm.ecnu.edu.cn/problem/2857 题意:解题思路编辑距离算法详解:Levenshtein Distance算法AC代码#include <bits/stdc++.h>using namespace std;const int maxlen = 505;int dp[maxlen][maxlen]; //(m+1)*(n+1)int main(){原创 2017-09-10 16:40:55 · 492 阅读 · 0 评论