动态规划
sumi
无冥冥之志者无昭昭之明 无惛惛之事者无赫赫之功!
有问题欢迎大家联系我,扣扣2513822561
展开
-
PKU DP专题
1037 A decorative fence1042 Gone Fishing1062 昂贵的聘礼1074 Parallel Expectations1093 Formatting Text1112 Team Them Up!1143 Number Game1160 Post Office1178 Camelot1179 Polygon1180 Batch转载 2012-02-04 12:51:28 · 556 阅读 · 0 评论 -
hdu 1160 FatMouse's Speed(最长递减子序列+输出路径)
题目分析:用一个结构体来存储,按w升序排列,查找递减序列用N^2算法...dp 数组用结构体,方便记录递减序列的上一个点#include#include#includeusing namespace std;struct node{ int no,w,s;}arr[2000];struct node1{ int v,pre;}dp[2000];int pa原创 2012-04-30 16:57:52 · 735 阅读 · 0 评论 -
hdu 1203I NEED A OFFER!(DP)
题目分析:定义dp[i][j]申请前i家学校,花费j,一家都没申请上的最小概率显然dp[i][j]=min(dp[i-1][j],dp[i-1][j-w[i]]*(1-p[i]));初始化:dp[i]=1;(0#include#includeusing namespace std;double dp[10010],p[1010];int w[1010];int mai原创 2012-04-19 21:06:08 · 459 阅读 · 0 评论 -
hdu 2577 How to Type(DP)
题目分析:参考了别人的思想!!!,为啥自己想半天都没想出这么好的方法 .数组on[i]代表到第i个字母时,大写键是开着时输入字母,所需的最小按键次数;数组off[i]代表大写键时关着时 ,到字母i,所需的按键最小次数;很明显有: 如果s[i]是大写字母{ on[i]=min(on[i-1]+1,off[i-1]+2); off[i]原创 2012-04-20 16:31:43 · 417 阅读 · 0 评论 -
最大子序列、最长公共子串、最长公共子序列
最大子序列最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序转载 2012-04-11 09:56:23 · 402 阅读 · 0 评论 -
最长上升子序列 LIS(Longest Increasing Subsequence)---DP
转载自:http://www.wutianqi.com/?p=1850引出:问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1例如有一个序列:1 7 3 5 9 4 8,它的最长上升子序列就是 1 3 4 8 长度为4.分析:这题目是经典的DP题目,也可叫作LIS转载 2012-04-08 15:50:05 · 550 阅读 · 0 评论 -
hdu 1421 搬寝室
题目分析:状态转移方程不会写!!!,参考了别人的思想!http://blog.sina.com.cn/s/blog_818d3d930100w1it.html注意一点,要对物品的质量升序排序!!!定义dp[i][j]为在i个物品中,选择2^j个,的最小疲劳度dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-[i-1])*(a[i]-a[i-1]));原创 2012-04-21 14:16:19 · 641 阅读 · 0 评论 -
hdu 1422 重温世界杯(最大连续子段和变形)
题目分析:吧 剩余的钱,放到数组arr[210000]中,按序放两边,一层循环2---n*2;动态转移方程:如果dp[i-1].v>=0 && dp[i-1].v+arr[i]>=0 dp[i].v=dp[i-1].v+arr[i], dp[i].sum=dp[i-1].sum+1;否则:dp[i].v=arr[i],注意如何防止重复了?1.如果原创 2012-05-06 17:08:16 · 943 阅读 · 0 评论 -
hdu 2084 数塔
#include#includeusing namespace std;int arr[110][110];int main(){ int c; scanf("%d",&c); while(c--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) {原创 2012-04-09 17:16:43 · 450 阅读 · 0 评论 -
DP(动态规划)的基本思想和基本步骤(zz)
转载自:http://hi.baidu.com/faithyacht/blog/item/1dde59820d62daa20df4d2a4.html 动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 动态规划法与分治法和贪心法类似,它们都是将问转载 2012-04-21 09:42:51 · 2205 阅读 · 0 评论 -
hdu 2391 Filthy Rich(很水的dp,记忆化搜索)
很水的dp,状态转移方程告诉了#include#include#includeusing namespace std;int maze[1100][1100],dp[1100][1100];int dir[3][2]={{-1,0},{0,-1},{-1,-1}};int r,c; bool inline IN(int x,int y){ if(1<=x&&x<=c&&1<=原创 2012-05-15 15:57:28 · 956 阅读 · 0 评论 -
hdu 1081 To The Max ****poj 1050(最大子矩阵和)DP
最大子矩阵和思想:从i到j (1#include#includeusing namespace std;int main(){ int n,matrix[120][120],b[120][120],b1[120],dp[120]; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++)原创 2012-04-10 15:27:53 · 501 阅读 · 0 评论 -
hdu 1159 Common Subsequence ***poj1458(最长公共子序列)
经典dp最长公共子序列:定义dp[i][j]为字符串X前i个字符和Y的前j个字符的最长公共子序列; 很明显: 如果 X[i]==Y[j],dp[i][j]=dp[i-1][j-1]+1; 否则:dp[i][j]=max(dp[i-1][j],dp[i][j-1]);#include#includeusing namespace原创 2012-04-11 12:36:16 · 428 阅读 · 0 评论 -
zoj 3623 Battle Ships(dp)
题目分析:参考http://www.cnblogs.com/slon/archive/2012/07/29/2614380.html一开始感觉像贪心题,就是不知道怎么贪心,,,赛完后,牛说是dp,经典类型的dp,dp[i][j]表示建造前k条船时,伤了i生命值,当前攻击力为j时所用的最小时间,,,, dp[i][j]=min(dp[i][j], dp[i-t[k]*(j-l[k])][原创 2012-07-31 10:12:34 · 1051 阅读 · 0 评论 -
POJ动态规划题目列表 及其 总结
1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡),转载 2012-04-14 21:38:38 · 928 阅读 · 0 评论 -
hdu 1176免费馅饼(数塔)
题目分析:和数塔差不多,dp[i][j]。行代表时间,列代表位置,状态转移方程:dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);注意边界,WA了几次,在j==0和10的时候,要注意!!!#include#includeusing namespace std;int dp[100010][15];int main原创 2012-04-19 22:58:18 · 547 阅读 · 0 评论 -
动态规划的状态表示分析
动态规划的状态表示(一)中国科技大学计算机系----黄浩达一、引言 问题求解技术,包括两个方面的内容:表示和搜索。在这两个方面的内容中,搜索是重点,表示是基础。不同的状态表示对搜索的效率会产生极大的影响。一个粗糙的状态表示可能使得搜索时要对状态变换进行更多的操作,而采取简洁的表示,搜索时进行的操作可能就显得方便、高效,甚至由于状态表示准确描述了问题的本质,给人以启示,从而转载 2012-02-04 12:54:29 · 618 阅读 · 0 评论 -
HDU 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】
原文转载于:http://www.cppblog.com/doer-xee/archive/2009/12/05/102629.html转载之前先Orz一下: [s:19]Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少转载 2012-04-06 22:35:18 · 653 阅读 · 0 评论 -
hdu1257 最少拦截系统(longest increasing subsequeue)
参考了 http://www.wutianqi.com/?p=1850的分析,^ ^#include#includeusing namespace std;int dp[1000];int LIS(int arr[1000], int n){int i;for(i=1; idp[i] = 0;int ans;dp[1] = 1;for(i=2原创 2012-04-08 15:56:56 · 462 阅读 · 0 评论 -
hdu 1025Constructing Roads In JGShining's Kingdom(LIS)
/*时间复杂度:(NlogN):除了算法一的定义之外,增加一个数组b,b[i]用以表示长度为i最长子序列的最后一个数最小可以是多少。易证:i在二分查找时,一直更新b[]内容,设此时b的总长度为k,若1. arr[i] >= b[k], 则b[k+1] = arr[i];若2. arr[i] 小值, 返回其位置pos,然后更新b[pos]=arr[i]。原创 2012-04-08 22:50:13 · 347 阅读 · 0 评论 -
hdu 1003 Max Sum
很基本的DP,复杂度为O(N)#include#includeusing namespace std;int arr[100010];struct node {int v,head;}dp[100010];int head,rear;int function(int n){int ans=0;dp[1].v=arr[1];dp[1].原创 2012-04-09 11:59:07 · 329 阅读 · 0 评论 -
hdu 1087 Super Jumping! Jumping! Jumping!(最长上升子序列变形)
注意:对最长上升子序列,理解不深刻,一直wa.....题目分析:每次从左向右,找arr[i]>a[j]&&dp[i]最大的,#include#includeusing namespace std;int arr[1010];int dp[1010];int main(){ int n; while(scanf("%d",&n)!=EOF) {原创 2012-04-21 22:09:46 · 624 阅读 · 0 评论 -
矩形嵌套
题目分析:矩形嵌套,很水的DP,先按长(宽)递增排序,再按宽(长)二级排序,类似最长上升子序列,dp[i]=max(dp[j])+1; 1原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=16#include#include#includeusing namespace std;struct node{ int a,b原创 2012-04-23 22:55:43 · 2426 阅读 · 0 评论 -
hdu 1069 Monkey and Banana(类似最长上升子序列,dp)
题目:monkey想吃banana,但是banana挂在一定的高度,现在有长宽高为,x,y,h的长方体,要你堆成一个台阶让monkey可以踩在上面,要求,上一层的 地面长和宽都要小于下层的,这样monkey在上台阶时才可以方便分析:因为每个长方体都有无数个可以使用,故先对输入的x,y,h排序成t1,t2,t3,(t1先按长排序,再按宽二级排序,对宽进行类似最长上升子序列,的dp,状态转移方原创 2012-04-24 13:13:19 · 689 阅读 · 0 评论 -
hdu 合唱队形
原题链接地址:http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1003&cid=10908&hide=0#include#include#includeusing namespace std;int arr[120],dp1[120],dp2[120];int main(){ int n; while(sc原创 2012-04-24 15:24:36 · 731 阅读 · 0 评论 -
最优二叉搜索树
这是一个经典的动态规划问题(但厉害的是其中带有一个很神奇的定理),问题是这样的:已知二叉搜索树中每个节点的访问概率,问这棵树整体的搜索时间最短是多少(此时称为最优二叉搜索树)。众所周知,在二叉搜树中,一次搜索的时间等于待访问节点的深度。所以整体的搜索时间为:节点i的访问概率 * 节点i的深度所以如果要整体搜索时间最短,则访问概率高的节点应该比较靠近根节点。乍一听,好像是哈夫转载 2012-04-11 17:16:46 · 789 阅读 · 0 评论 -
hdu 1085 Humble Numbers(打表)
题目:一个数的素数因子是只有有2,3,5,7,叫做humble number,前20个 humble number为 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27...求第n个humble number;分析:打表,开一个数组HumbleNumber[6000][5],HumbleNumber[i原创 2012-04-13 16:56:52 · 538 阅读 · 0 评论 -
hdu 2488 Coins(多重背包)
题目:给n种硬币,每个的价值为A[i],个数为C[i],给出m,求能凑出小于m的多少种价值.分析:给每一种硬币加一个属性V[],代表容量,并赋值V[]=A[],定义dp[i][j],为前i种硬币,放到容量为j背包中的所组成的最大价值,再来一次扫描,如果的dp[j]=j,则ans++;#include#includeusing namespace std;const in原创 2012-04-14 09:26:02 · 163 阅读 · 0 评论 -
hdu 2845 Beans(dp)
题目分析:参考的 别人的 思想,想了好几天...没思路,因为1不可能开20000*20000的数组,所以应该会一维一维地考虑...对于一维来说,每一个元素来说,要么取a[i]+a[i-2],要么取a[i-1]...故状态转移方程为:a[i]=max(a[i-2]+a[i],a[i-1]);i>=2.............对行来说,类似处理#include#include原创 2012-04-27 12:20:27 · 446 阅读 · 0 评论 -
hdu1231 最大连续字段和(DP)
//要求输出最大连续字段和的第一个数和最大一个数,在DP[]中加一个数组记录开始元素就可以了#include#includeusing namespace std;struct node{ int head,v;}dp[10010];int arr[10010];int head,rear;int function(int k){int ans=-2原创 2012-04-09 16:52:49 · 596 阅读 · 0 评论