
算法—DP
王老大_
奋斗在路上
展开
-
poj 2127 Greatest Common Increasing Subsequence (记录路径LICS)
题意:求最长递增公共子序列这道题需要将该序列输出,这就牵涉到了路径记录的问题. #include #include #include using namespace std; int a[505],b[505],dp[505],n,m,cnt; int mark[505][505],ans[505]; int LICS() { int i,j,MAX,k; memset原创 2015-04-20 16:55:01 · 520 阅读 · 0 评论 -
HDU1159 && POJ1458 Common Subsequence (LCS模版题)
题目大意:求出两个串的公共子序列的长度 LCS的入门题,读懂题了直接模板就可以 #include #include using namespace std; const int N=1000; int a[N][N]; int LCS(const char *s1, const char *s2) {// s1:0...m, s2:0...n int m = strlen(s原创 2015-04-17 20:43:07 · 529 阅读 · 0 评论 -
POJ 2533 Longest Ordered Subsequence (DP最长上升子序列)
题目的大意是:给出一序列,求出该序列的最长上升子序列的最大长度。 思路: a: 1 7 3 5 9 4 8 dp: 1 2 2 3 4 3 4 #include #include using namespace std; const int MAXN = 1005; int main() { int n; while( cin>>n ) {原创 2015-04-17 20:05:29 · 446 阅读 · 0 评论 -
POJ 1163 The Triangle (简单 DP 数字的最大路线和)
题目大意:从三角形顶部数字走,每次只能走到这个数字的左下角或者右下角的数字,直到底部,计算走过的线路的数字之和,求这个和的最大值。 #include #include #include using namespace std; const int MAXN = 105; int dp[MAXN][MAXN], a[MAXN][MAXN]; int main() {原创 2015-04-17 18:43:46 · 666 阅读 · 0 评论 -
poj 2250 Compromise (LCS)
题目大意:给出两段文字,求出最长的公共单词串。 直接是以前的代码改一点就A了。 #include #include #include using namespace std; char s1[35][100],s2[35][100],s[35][100]; int len1,len2,dp[105][105],mark[105][105],l; void LCS()原创 2015-04-21 19:57:41 · 530 阅读 · 0 评论 -
POJ 2559 Largest Rectangle in a Histogram (DP最大矩形面积)
给定从左到右多个矩形,已知这此矩形的宽度都为1,长度不完全相等。这些矩形相连排成一排,求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围。l[i]表示大于等于h[i]的最左边的位置,r[i]表示大于等于h[i]的最右边的位置,这样可以预处理出l[],r[],然后ans = max(ans, r[i] - l[i] + 1) * h[原创 2015-04-16 19:55:27 · 716 阅读 · 0 评论 -
POJ 3670 Eating Together (①O(n)的dp,②最长字段和)
题目大意:找到队列中不符合非升(降)序趋势的编号个数,分别判断升序跟降序的个数,最后取最小。#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std;#define maxn 30005int n; int cow[maxn]; int f[maxn][5];int原创 2015-04-15 18:38:29 · 805 阅读 · 0 评论 -
POJ 2533 Longest Ordered Subsequence (模版LIS)
题意:输出最长递增子序列的长度思路:直接裸LIS, #include const int N = 1001; int a[N], f[N], d[N]; // d[i]用于记录a[0...i]的最大长度 int bsearch(const int *f, int size, const int &a) { int l=0, r=size-1; while( l <= r ){原创 2015-04-20 15:29:50 · 457 阅读 · 0 评论 -
POJ 2479 Maximum sum ( DP )
题目大意: 对整数串S,求其两个不相交的子串s1、s2,使得s1+s2的值最大。方法:DP, lt[i]代表以第i个元素结尾的串最大值 rt[i]代表以第i个元素开头的串的最大值 那么设置一个rtm[i]代表取后i个元素之中最大连续子串的和很显然,lt[i]=max(a[i],lt[i-1]+a[i]); rt[i]=max(a[i],rt[i+1]+a[i]); rtm[i]=ma原创 2015-04-15 20:41:16 · 515 阅读 · 0 评论 -
POJ 3671 Dining Cows (DP)
题目大意:给你一串只有1,2的数字,让你改变最少的次数,让这个序列变成非递减的。 思路:动态规划,判断分界点,开一个dp[30010][2]的数组,其中dp[i][j]表示把第i个数改成j最少要花多少次 那么状态转移方程就列出来了: 令a=1 j!=a[i] 0 j==a[i] 那么dp[i][1]=dp[i-1][1]+a; dp[i][2]=min(dp[i-1][1],dp[i-原创 2015-04-14 20:18:32 · 733 阅读 · 0 评论 -
HDU 1503 Advanced Fruits (LCS升级版)
题目大意:将两个字符串结合起来,他们的公共子串只输出一次 根据LCS的原理,将每个字符都进行标记,看两个字符串中对应的字符究竟处于什么状态,然后输出,其标记为公共子串的字符只输出一次即可,也是一道模板题了。 http://blog.youkuaiyun.com/libin56842/article/details/9618529 #include #include #include using原创 2015-04-19 11:16:21 · 597 阅读 · 0 评论 -
POJ 3903 Stock Exchange (LIS模版题)
题目跟poj2533一样,改一下数组大小完美A过。 #include const int N = 100001; int a[N], f[N], d[N]; // d[i]用于记录a[0...i]的最大长度 int bsearch(const int *f, int size, const int &a) { int l=0, r=size-1; while( l <=原创 2015-04-22 19:22:07 · 500 阅读 · 0 评论 -
poj2096 (dp求期望)
题意:一个软件有s个子系统,会产生n种bug。 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中。 求找到所有的n种bug,且每个子系统都找到bug,这样所要的天数的期望。 需要注意的是:bug的数量是无穷大的,所以发现一个bug,出现在某个子系统的概率是1/s, 属于某种类型的概率是1/n。 解法: dp[i][j]原创 2015-11-10 19:05:10 · 318 阅读 · 0 评论