![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
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 · 257 阅读 · 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 · 250 阅读 · 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 · 335 阅读 · 0 评论 -
ural 1017
题意:有N 块砖头,问可以组成多少种楼梯,条件是楼梯至少为两层,每层的数量也不能相等,题解和划分数很相似。dp 思想的一道题,转移方程很难想,想了解如何想出的状态转移方程的,请移步这个牛人的博客:http://www.cnblogs.com/skyivben/archive/2009/03/02/1401728.htmldp[k][i] 表示数k 的最小被加数不小于k 的划分的个数。#in原创 2015-08-01 13:45:49 · 548 阅读 · 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 · 377 阅读 · 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 · 422 阅读 · 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 · 357 阅读 · 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 · 452 阅读 · 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 · 409 阅读 · 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 · 293 阅读 · 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 · 337 阅读 · 0 评论