随笔分类 -  DP

[leetcode] Longest Palindromic Substring *
摘要:1 /* 2 * DP 3 * 4 * d[i][j] represents the length of longest Palindromic 5 * substring of s[i...j]. 6 * 7 * |- j-i+1 (s[i] == s[j] && s[i+1...j-1] is Palindrome) 8 * d[i][j] = | 9 * |- max{ d[i+1][j], d[i][j-1] }10 *11 * Note: use circular array.12 */13 14 #incl... 阅读全文

posted @ 2013-03-08 23:31 龙豆 阅读(276) 评论(0) 推荐(0) 编辑

poj-2411 Mondriaan's Dream ***
摘要:1 /* 状态压缩DP , 类似炮兵阵地(POJ1185,本blog有。。) 2 * 3 * 自己写的,判断是否合法写的很长。。。 4 * 5 * 贴个"解题报告"吧。。 6 * 7 Assume you could calculate the number of different paintings 8 for a rectangle with c columns and r rows where the first r-1 9 rows are completely filled and the last row has any of 2c ... 阅读全文

posted @ 2012-03-26 14:38 龙豆 阅读(508) 评论(0) 推荐(0) 编辑

poj-1179 Polygon **
摘要:1 /* 2 * 枚举第一次断开的边,然后DP, 3 * 4 * DP还是很简单的, 类似矩阵连乘 5 * 需要注意的是:由于负负得正,所以你不能只算最大值. 6 * 也就是说要计算多边形上连续的一段所能达到的最小值和最大值. 7 * 8 * 难的是断开第k条边后如何给剩下的边重新编号 9 * 10 * 这里建立了一个映射,如断开第k条边, 11 * 则原来的第k+1条边编号为0,原来的第k-1条边编号为n-2. 12 * 13 * getNum(i, k)函数用于计算断开第k条边后新编号为i的边的原编号 14 * 15 * 16 * 17 ... 阅读全文

posted @ 2012-03-25 21:00 龙豆 阅读(393) 评论(0) 推荐(0) 编辑

最长单调递增子序列 [转]
摘要:[转] http://skynewborn.blog.sohu.com/66594610.html 单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列。首先,从定义上明确我们的问题。给定序列a1, a2, …, an,如果存在满足下列条件的子序列ai1<=ai2<=…<=aim, (其中i1<i2<…<im)即称为一个原序列的长度为m的单调递增子序列,那么,现在的问题是我们要找出一个序列的最长的单调递增子序列。 直观上来说,一个序列Sn,它有2n个子序列,枚举所有的子序列,找出其中单调递增的序列,然后返回其中最长的,这样我们的问 阅读全文

posted @ 2012-03-06 17:10 龙豆 阅读(2693) 评论(0) 推荐(2) 编辑

poj-1737 Connected Graph[转] ***
摘要:1 /* 2 3 [转]http://hi.baidu.com/accplaystation/blog/item/51417bdca982bea4cc116660.html 4 5 这道题据说有两种思路: 6 7 1——将总的方案数减掉所有不连通的方案。 8 9 总的方案数是2^(C(n,2)),不连通的方案数可以如下考虑:10 11 当和点1连通的点数共有k个时,方案数为C(n-1,k)*F(k+1),其他n-k-1各点间任意连边即可, 方案数为2^(C(n-k-1,2)),所以这样的方案数共有C(n-1,k)*F(k+1)* 2^(C(n-k-1,2))种。12 13 因此可以... 阅读全文

posted @ 2012-03-05 21:34 龙豆 阅读(1028) 评论(0) 推荐(0) 编辑

黑书-DP-方块消除 ****
摘要:具体题目见 《算法艺术与信息学竞赛》P123或 http://tyvj.cpwz.cn/Problem_Show.asp?id=1227 (可提交) 以下是代码(转自:http://www.cnblogs.com/jiaohuang/archive/2010/10/20/1856294.html) 1 /* 2 方块消除 3 先压缩下状态用把每种颜色压到一位,记录下每一位的长度 4 状态方程式dp[i][j][k] = max(dp[i][j-1][0] + (len[j]+k)^2 , dp[i][p][len[j]+k] + dp[p+1][j-1][0] ) 5 k表示前面剩余的量。.. 阅读全文

posted @ 2012-03-02 17:53 龙豆 阅读(628) 评论(0) 推荐(0) 编辑

poj-2430 Lazy Cows ****
摘要:1 //参见 http://hi.baidu.com/billdu/blog/item/6315841769e6905ff3de325e.html (有图有真相...) 2 //... 3 // 4 //dp[i][j][k]表示到达第i列,已经建设好了j个围栏,最后一列状态是k的情况下框住的最小面积 5 // 6 //另外, 我这个代码是 顺推(按黑书的分类),也就是基于当前状态,遍历之前的能得到这个当前状态的状态,取最佳值 7 //而参考的那个是 逆推, 也就是基于当前状态,计算能由这个“当前状态”推出的“下一状态”,如果这样推能使“下一状态”的值更佳 8 //则更新“下... 阅读全文

posted @ 2012-03-02 16:11 龙豆 阅读(734) 评论(0) 推荐(0) 编辑

poj-1159 Palindrome **
摘要:1 /* 2 * DA-term-Palindrome.cpp 3 * 4 * DP 5 * 6 * 动态规划求解。 7 8 设ch[1]..ch[n]表示字符串1至n位,i为左游标,j为右游标 ,则i从n递减,j从i开始递增。 9 min[i][j]表示i和j之间至少需要插入多少个字符才能对称,初始置全0 ,我们最终需要得到的值是min[1][n].10 则11 if(ch[i]==ch[j]) //如果两个游标所指字符相同,向中间缩小范围12 mi... 阅读全文

posted @ 2012-02-17 18:43 龙豆 阅读(175) 评论(0) 推荐(0) 编辑

poj-1080 Human Gene Functions **
摘要:1 /* 2 * Human Gene Functions.cpp 3 * 4 * Created on: 2011-12-9 5 * 6 * 类似 最长公共子串 7 */ 8 9 #include <cstdio>10 using namespace std;11 12 const int maxn = 100 + 5;13 14 const int s[5][5] = {{5, -1, -2, -1, -3}, //分数矩阵15 {-1, 5, -3, -2, -4},16 ... 阅读全文

posted @ 2012-02-17 18:40 龙豆 阅读(251) 评论(0) 推荐(0) 编辑

poj-1837 Balance ***
摘要:/* [转] * * d[i][j]表示在挂上前i个物体的时,平衡度为j * (j>0时表示左边重,j=0时表示天平平衡,j<0时表示右边重)时挂法的数量, * 而根据题意可以确定j的取值范围为:[-7500,7500],于是可以得到状态转移方程为: * d[i][j]+=(d[i-1][j-weigh[k]*pos[i]]), * weigh[k]表示第k个挂钩的位置,pos[i]为第i个砝码的重量 * 由于j-weigh[k]*pos[i]可能为负数,因此统一加上7500, * 那么初始状态d[0][7500]=1(此时表示天平平衡),表示不用... 阅读全文

posted @ 2011-09-02 16:32 龙豆 阅读(203) 评论(0) 推荐(0) 编辑

poj-1505 Copying Books ***
摘要:/* * DP * d[i][j] : 前i个人,分完1~j本书,d值满足:minimize the maximum number of pages assigned to a single scriber * d[k][m]即为所求 * * 状态转移方程:d[i][j] = min( max(d[i-1][t] , page[j] - page[t]) ) 其中: i-1 <= t <= j-1 (注意每个人至少一本书) * 其中 page[i] 为 1~i本书的总页数, page[j]-page[t] 即为第j个人分到的页数 * * 最后注意满足 “If there is mo 阅读全文

posted @ 2011-07-28 17:56 龙豆 阅读(478) 评论(0) 推荐(1) 编辑

poj-3034 Whac-a-Mole
摘要:dp先自己写了一个。。 n次WA后搞成TLE~ 。。。 忍无可忍。。 后来参考了网上的代码。 最终AC~先贴人家的代码吧~【转】思路:DP。改了要一天,很纠结的一道题。DP部分,dp[t][x][y]表示第t时间把锤子停在(x,y)上最多能够打到的地鼠数量。则dp[t][x][y]= max(dp[t-1][xx][yy]+ (xx,yy)到点(x,y)新打的地鼠数),(xx,yy)和(x,y)的直线距离<d。但是最主要的是下面两点:1:中转点可能在区域外,如下数据: //相当重要!!!20 5 41 0 10 1 10 5 21 6 2答案应该是4而不是3,这就需要扩展区域为n+2d就 阅读全文

posted @ 2011-07-09 16:52 龙豆 阅读(608) 评论(0) 推荐(0) 编辑

poj-1925 Spiderman
摘要:dpd[i] 表示从apartment到 横坐标 i 最少需跳几步。。 p[i] 建筑物 i 的横坐标, h[i]建筑物i的纵坐标注意 由对称性,spiderman的纵坐标始终是 apartment 的高度!! 所以不需要管纵坐标!!遍历每个建筑物。。 从横坐标 j 能跳过建筑物 i 需满足: (p[i] - j)^2 <= h[i] ^ 2 - (h[i] - h[1]) ^2 从横坐标 j 经建筑物 i 后 到达横坐标 2 * p[i] - j。。 综上, d[2 * p[i] - j] = min(d[2 * p[i] - j] , d[j] + 1)...最后注意到达west t 阅读全文

posted @ 2011-07-08 22:09 龙豆 阅读(813) 评论(0) 推荐(0) 编辑

poj-2948 Martian Mining
摘要:dpdp[i][j]表示(1,1)-(i,j)小矩阵的最大收获,可以轻松得到dp方程:dp[i][j] = max( dp[i][j-1] + col[j][i], dp[i-1][j] + row[i][j]);其中row[i][j]表示第i行从第0列到j列的和,col[i][j]表示第i列从第0行到j行的和。#include <cstdio>#include <cstring>using namespace std;const int MAXN = 500 + 5;int n, m;int data_x[MAXN][MAXN];int data_y[MAXN][MA 阅读全文

posted @ 2011-07-07 21:09 龙豆 阅读(293) 评论(0) 推荐(0) 编辑

poj-2029 Get Many Persimmon Trees
摘要:my code:/** 2029.cpp** Created on: 2011-7-6* Author: */#include <iostream>#include <cstring>using namespace std;const int MAXN = 100 + 5;bool tree[MAXN][MAXN] = {}; //坐标上是否有树int d[MAXN][MAXN] = {}; //一维矩阵上的树的总数(坐标表示1*1元)int ans[MAXN][MAXN] = {}; //s * t 矩阵上的树的总数(坐标表示1*1元)int imax = -1;in 阅读全文

posted @ 2011-07-06 18:35 龙豆 阅读(188) 评论(0) 推荐(0) 编辑

poj-3280 Cheapest Palindrome[转]
摘要:这个dp题可以算是很顺利的一题,虽说之前看了看就觉得很难没管它,但是今天真的不一样,开始其实思路还有点乱麻,只过了几分钟我忽然间就理清了思 路,得到了一个dp子问题,可能还要归功于之前做了一题叫括号匹配的类似dp给了我灵感,真的构造出来和没有构造出前的差别很大啊!同学们!相信自己的实力吧!但是要自信加合理推导才能得出信服的答案!其实dp很难逃出3种思路:1、一维线性dp:每次考虑i时,选择最优子问题要么在i-1,要么在1...i-1里;2、二维线性dp:考虑(i,j)子问题时,选择最优子问题要么在(i+1,j)、(i,j-1),要么在i<= k <=j,在k里;3、树形dp:考虑i 阅读全文

posted @ 2011-07-06 10:30 龙豆 阅读(582) 评论(0) 推荐(0) 编辑

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示