动态规划
文章平均质量分 62
Sor4
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
poj 1080 LCS 应用
题意:给定两个DNA序列,然后按照给出的表格进行匹配,求匹配的最大值,利用lcs 原理,不过加了权值,就不能再像之前那样进行匹配了,但是原理是一样的。 因为有‘-’的存在,所以这边要先对边界进行处理一下。因为带权值,所以求得的不一定会是最长公共子序列,所以就不用判断str1[i]==str2[j]这种条件了。 转移方程: dp[i][j]表示的是str1从0~i-1和str2从0~j-1 匹原创 2015-08-12 14:47:06 · 309 阅读 · 0 评论 -
poj 1458 LCS
#include #include #include #pragma warning (disable :4996) using namespace std; const int Max = 1000; int dp[Max][Max]; char str1[Max], str2[Max]; int LCS(int lenstr1, int lenstr2) { memset(dp,原创 2015-08-07 16:31:13 · 309 阅读 · 0 评论 -
poj 1631 LIS nlogn算法
题意:给出n个点,分别和1~n相连构成相交线段,现在要去几条线段,要求剩下的线段不想交,且不相交的线段数量最多。 因为p #include #include #include #pragma warning(disable :4996) using namespace std; const int Max = 40005; int c[Max]; int Binary(int l,原创 2015-08-09 14:48:51 · 400 阅读 · 0 评论 -
ural 1017
题意:有N 块砖头,问可以组成多少种楼梯,条件是楼梯至少为两层,每层的数量也不能相等,题解和划分数很相似。dp 思想的一道题,转移方程很难想,想了解如何想出的状态转移方程的,请移步这个牛人的博客:http://www.cnblogs.com/skyivben/archive/2009/03/02/1401728.html dp[k][i] 表示数k 的最小被加数不小于k 的划分的个数。 #in原创 2015-08-01 13:45:49 · 615 阅读 · 0 评论 -
cf 10D lcis 最长上升子序列+输出路径
用个数组记录下路径然后dfs 输出就可以了 #include #include #include #pragma warning (disable : 4996) using namespace std; const int Max = 505; int dp[Max][Max], pre[Max][Max]; int a[Max], b[Max]; int m, n; void df原创 2015-08-12 19:48:48 · 443 阅读 · 0 评论 -
light oj 1013 LCS 应用
题意:给定两个字符串A,B,要求求一个字符串S,使得A,B是S 的子串,求S 的最小长度,以及在此长度下有多少种构成S 的方案。 LCS的变形,S的最小长度肯定是A+B的长度-A和B的最长公共组序列的长度。之后的方案用DP思想去写就可以了。QAQ 我也是看了题解才会写的。 先用lcs 去求A和B 的最长公共子序列。 然后dp[i][j][k]表示构造了i长度的字符串,在利用了A串的前j个字符原创 2015-08-07 14:40:10 · 482 阅读 · 0 评论 -
light oj 1017 Brush (III)
题意:给N个点,然后刷子的宽度w,刷子可以平行于x轴无限刷,给出可以刷的次数,求刷子可以覆盖多少个点。 因为可以平行于x轴无限刷,所以不需要考虑x轴上的点, 直接对Y轴进行排序,预处理一个数组mv,mv[i]表示如果刷子的底部刷到了i,那么会向上影响mv[i]个点。 #include #include #include #pragma warning (disable :4996) us原创 2015-08-09 12:31:34 · 427 阅读 · 0 评论 -
light oj 1021 状态压缩dp
给一个B进制的数,一个10进制的数K,B进制数有x位,对着x位进行全排列的话,有x!种可能,问这x!的可能中,有多少种可以整除K,各个位置上的数字都不同。 代码也是看过题解之后才会写的 QAQ。。。。。。。。 状态压缩dp,每次选一个没有用过的数,然后选一个没有用过的位置放上去,位置不一样,加上的值也不一样,然后直接记录对K取余,余数有多少种。 dp[i][j]表示数位为i(i为1表示数字原创 2015-08-11 19:40:40 · 515 阅读 · 0 评论 -
light oj 1110 LCS 记录路径
#include #include #include #pragma warning (disable : 4996) using namespace std; const int Max = 105; int dp[Max][Max]; char s[Max][Max][Max]; char str1[Max], str2[Max]; int main() { int T, k, i原创 2015-08-12 15:34:14 · 469 阅读 · 0 评论 -
light 1011 状态压缩dp
题意:给一个N*N的二维数组,从中选出N个数 要求不能同行同列, 求这N个数最大数的和 状态压缩。 每个i+1由上一个i推出来,这个直接一个for 搞一下就可以,剩下的就是枚举每个列。开一个dp[1 (1 异或表示去掉一个1,比如1000&1010 = 1 然后1010^1000 = 0010,这样就去掉了一个1 ,就表示我要选择这列 m-1 就表示换到下一层。 #incl原创 2015-08-04 12:11:21 · 361 阅读 · 0 评论 -
light oj 1025 区间dp
题意:给一个字符串,问有多少种方法通过移动去除中的字符使之变成回文串。 思路:区间dp,dp[i][j]表示区间i~j的方案总数。 对于串str,两个for进行控制,第一个for从后往前,第二个for从i+1开始,到串的最后,如果str[i] == str[j],那么dp[i][j] += dp[i+1][j-1] + 1,因为如果去掉i+1~j-1之后,因为str[i] == str[j]原创 2015-08-06 16:50:34 · 401 阅读 · 0 评论
分享