动态规划
代码随想录
代码随想录网站:https://programmercarl.com
展开
-
hdu 1507 Largest Rectangle in a Histogram 动态规划计算最大面积
记录动态规划dpl,dpr,分辨记录i左面的比i大的,右面比i大的,然后(dpr[i]-dpl[i]+1)*h[i]得出长度动态转移方程while(temp>1 && h[temp-1]>=h[i]) temp=dpl[temp-1]/************************************************************************* > F原创 2014-08-25 00:59:38 · 1293 阅读 · 0 评论 -
hdu 1003 Max Sum 简单动态规划
很间的动态规划但ac率低于四分之一了,状态转移方程:dp[i]=max(dp[i-1]+a[i],a[i])注意几点:case 之间有空格输入的最小负数为-1000有多组答案找出第一个的意思是,从头便利,得到第一个最大的和就输出被,然后break;/*****************************************************************原创 2014-08-24 21:37:20 · 1023 阅读 · 0 评论 -
hdu 1231最大连续子序列 动态规划
动态转移方程dp[i]=max(dp[i-1]+a[i],a[i]);dp[i]表示一这个点结尾的最大连续子序列因为还要记录序列的头和尾,用start[]记录每个点在该序列的起始位置注意提示要用scanf啊,cin会TLE/************************************************************************* > Fil原创 2014-08-24 21:16:47 · 909 阅读 · 0 评论 -
hdu 1864 最大报销额 模型为简单的01背包
很简单的01背包,但是题目还是很蛋疼的注意题目中600,和1000这两个数,还有就是double和int的转换,1A了感觉还是不错的/************************************************************************* > File Name: hdu1864.cpp > Author: yang > Mail:8261230原创 2014-08-24 11:00:44 · 1151 阅读 · 0 评论 -
hdu Robberies 2955 01背包
第一次果断吧概率当成背包了,放大100000倍,而且强多家银行的概率是相乘,不是相加啊将抢的钱数当成背包转移公式:dp[j]表示在能抢到j百万的时候成功的最大概率dp[j]=max(dp[j],dp[j-m[i]]*(1-p_bank[i]));/********************************************************************原创 2014-08-23 13:36:05 · 951 阅读 · 0 评论 -
hdu 动态规划46题
1.Robberies连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱最脑残的是把总的概率以为是抢N家银行的概率之和…把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在...原创 2014-08-18 00:01:23 · 2342 阅读 · 0 评论 -
hdu 3466 Proud Merchants
这道题对q-p进行从小到大排序,举一个比较直观的例子:4 205 15 208 12 192 16 219 11 13按照q-p排序后每行dp的变化0 0 0 0 0 0 0 0 0 0 0 13 13 13 13 13 13 13 13 13 13 0 0 0 0 0 0 0 0 0 0 0 13 19 19 19 19 19 19 19 32 32 0 0原创 2014-07-31 15:05:48 · 798 阅读 · 0 评论 -
hdu 2546 饭卡 01背包
先将前n-1个从小到大排序,对m-5进行01背包,然后答案就是m-dp[m-5]-a[n-1]至于为什么最后减去最贵的菜品,而不是把最贵的菜品也放到01背包里呢,因为如果可以把最贵菜品a[n-1]可以放到背包里,那么其他菜品a[i]也一定可以放在背包里(背包的容量为m-5),最后都是减去a[i]+a[n-1],所以可以吧最贵的菜品不放入背包,直接最后减去原创 2014-07-31 10:37:25 · 960 阅读 · 0 评论 -
HDU 1069 Monkey and Banana 动态规划
这道题不能单纯的比面积,是长宽都要小于下面的木块才可以放,下按照x排序,之后在比较x,y,然后就是求最大递减序列,在输入的时候先将d数组排序,因为一个木块有六种放的方法,如果不排序,把六种情况都列出来也可以。排序之后呢,相当于规定在同等高度的木块都朝着x轴短的这面放,所以就一共只有三种可能了在更新的时候一定记住每一轮要更新dp[i],而不是更新dp[j]例如 :for(int i=...原创 2014-07-30 20:33:32 · 882 阅读 · 0 评论 -
hdu 1054 Strategic Game 树形dp基础&&模板
第一次独立的写出来树形dp,但是是看着模板写的,发现树形dp只要找到父亲节点与儿子节点的关系,问题就好办了之前初始化dp[u][1]=1转移方程dp[u][1]+=min(dp[v][0],dp[v][1]); dp[u][0]+=dp[v][1];void dfs(int u){ int i, j, k; vis[u]=1; 操作:u节点dp初始原创 2012-10-31 21:15:59 · 1539 阅读 · 1 评论 -
zoj 3329 One Person Game 概率dp(有环)
自己看了很多blog才弄明白,自己就不说什么啦,建议在做几道简单题再做这道题,我认为这个blog写的很好,很具体 http://blog.csdn.net/morgan_xww/article/details/6775853#include#includeusing namespace std;#define M 505double dp[M],A[M],B[M],p[M];int n,原创 2012-10-29 08:56:54 · 871 阅读 · 0 评论 -
poj 3071 Football 概率dp
这道题看如果能想到dp[i][j]表示i表示第i次比赛,j队硬的概率 就一定能做出来了,在看解题报告也没有用了,这道题解题报告说不明白,代码也毫无可读性,所以还是硬憋吧!#include#include#includeusing namespace std;double map[200][200];double dp[9][200];int main(){// fr原创 2012-10-28 14:03:39 · 840 阅读 · 0 评论 -
hdu 3853 LOOPS 概率dp入门题
状态转移方程很好想,除的时候注意分母dp[i][j]=1+dp[i][j+1]*map[i][j][2]+dp[i+1][j]*map[i][j][3]+dp[i][j]*map[i][j][1];#include#include#includeusing namespace std;#define M 1005double map[M][M][4],e[M][M];int m原创 2012-10-27 10:18:14 · 912 阅读 · 0 评论 -
poj 2096 Collecting Bugs 概率dp入门题
e(i,j)=1+(i*j/n/s)e(i,j)(原地不动)+(i*(s-j)/n/s)e(i,j+1)(s-j中发现bug)+((n-i)*j/n/s)e(i+1,j)(n-i中发现bug)+(n-i)(s-j)/n/s*e(i+1,j+1)(s-j和n-i中发现bug)#include#include#includeusing namespace std;double e[1005原创 2012-10-27 08:54:12 · 1157 阅读 · 0 评论 -
hdu 4405 Aeroplane chess 概率dp
第一次做概率dp,对期望理解的还不到位,先写一下现在的感悟,理解不足希望指教啊!e[i]表示i的位置走道n所需要的期望步数那么e[i]怎么求,首先e[i]走道e[i+1]的概率为1/6 ,而e[i+1]是走道终点的期望步数,所以e[i]=e[i+1]*1/6+1,为什么加一呢,因为你向前走了一步,期望表示的是步数一次类推 e[i]=1+e[i+1]*1/6+e[i+2]*1/6+e[i原创 2012-10-27 08:48:59 · 783 阅读 · 0 评论 -
hdu 4323 Magic Number dp 多校联合赛(三)第四题
如果a[i],b[j]相等dp[i][j]=dp[i-1][j-1]; 如果不想等 dp[i][j]=min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]))+1;注意最后dp[lena-1][lenb-1]#include#include#includeusing namespace std;int n,m,dp[15][15];int y;in原创 2012-08-05 13:55:15 · 2073 阅读 · 0 评论 -
poj 2506 Tiling dp 递推
我是有用dp做的,做完之后看网上大多人都是推出公式,反正我是没看出来dp[i][j],i表示第i列放入一竖条,j表示放入的竖条是什么形状,j一共有5种情况,dp就表示这个i表示第i列放入一个j类型竖条有几种摆放方法如图 0~4表示j的五种状态然后就有递推公式dp[i][0]=dp[i-1][0]+dp[i-1][3]+dp[i-1][4]dp[i][1]=dp[i-1]原创 2012-07-24 08:37:30 · 904 阅读 · 0 评论 -
hdu 4301 Divide Chocolate 动态规划 递推 多校联合赛第二题
给你n*2这么大的巧克力 问你有多少种分发,这道提想暴力都困难,先想到一中递推关系,先定义dp[i][j][z],i表示第i列,j表示i列内分成j部分,z表示第i列的两块巧克力处于分开的状态还是和并的状态!!如图 也就是说如果已经是第i列,则如果添加第i+1列则有三种情况,第一种是还是j部分,也就是不加部分,第二种是加一部分,j+1,第三种是加两部分,j+2,第一种情况是dp[i][j][1]=d原创 2012-07-20 08:39:44 · 1519 阅读 · 0 评论 -
codeforces D. Palindrome pairs 动态规划
刚开始作道题 我只是想到一个 n四次方的算法 不敢打啊!!!后来和同学讨论讨论 得到一个 n二次方的算法还可以 就是计算出一i为尾节点的回文个数dp1[i],计算出以i为头节点的个数dp2[i],这样只要做相乘就可以啦 这个事n方,之前处理dp1[i],dp2[i]也是n方的算法 详细看代码吧!!!!#include <iostream>#include <s...原创 2012-04-25 01:34:16 · 1298 阅读 · 0 评论 -
poj 1609 Tiling Up Blocks 动态规划
题意就是 给你一些砖n1,n2,n3 砖两个值x1,y1,x2,y2,x3,y3 只有当x2>=x1&&y2>=y1时 n2可以放在n1上 问最高能落多高 理解题意主要知道 tile 这个词vt.用瓦片、瓷砖等覆盖 #include using namespace std; int a[105][105]; #define doit(m,n)原创 2012-03-14 08:54:10 · 3630 阅读 · 0 评论 -
poj 2018 Best Cow Fences 二分查找dp
惭愧 参考bloghttp://www.cppblog.com/varg-vikernes/archive/2010/03/02/108737.aspx #include<iostream> using namespace std; #define doit(n) for(int i=1;i<=n;i++) double a[100005],sum[10000...原创 2012-03-10 13:36:06 · 1327 阅读 · 0 评论 -
poj 1036 Gangsters dp 简单题
#include<iostream>using namespace std;#include<algorithm>struct node{ int t; int p; int s;}a[105];bool cmp(node a,node b){ return a.t<b.t;}short dp[3000...原创 2011-10-31 02:09:26 · 1192 阅读 · 0 评论 -
poj 2559 Largest Rectangle in a Histogram dp!!!
话说这种相当于压缩路径的方法#include<iostream>using namespace std;typedef long long ll;ll a[100005];int main(){ int left[100005],right[100005]; int n; while(scanf("%lld",&n),n!=0) { for(in...原创 2011-10-05 19:32:05 · 880 阅读 · 0 评论 -
poj 2385 Apple Catching 经典dp
这道题让我对于这种类型题有了一个比较深的理解!!!主要思路就是用跳的数目去更新dp[][]。#include<iostream>using namespace std;int dp[50][1005];int a[1005];int main() { int t,w; while(cin>>t>>w) { ...原创 2011-08-28 16:03:40 · 1218 阅读 · 0 评论 -
poj 2355 Railway tickets 很纯的dp
我一开始在想如何建立dp方程,后来建不出来,还是自己的思想太狭隘了!!这个题可以从让i从start+1到end,扫,让j=i,j》start,不断提取最优值#include<iostream>using namespace std;int a[10005];int dp[10005];int main(){int l1,l2,l3,c1,c2,c3,n,start,...原创 2011-08-25 19:53:00 · 1418 阅读 · 0 评论 -
poj 1952 BUY LOW, BUY LOWER dp 但去重真是令人纠结
这道题一开始看感觉很简单,就一个降序问题,后来这个去重真是让我煞费苦心啊!!!注意b[]数组的作用#include<iostream>using namespace std;int dp[5005];//记录降序长度int a[5005];int b[5005];//记录出显个数int main(){int n;while(cin>>n){...原创 2011-08-20 13:52:24 · 781 阅读 · 0 评论 -
poj 1958 Strange Towers of Hanoi dp,需要仔细读题
这道题应该仔细读题啊!!!题应经告诉你状态转移方程,我做这道题的时候就不淡定了,看的结题报告,在重新读题的时候豁然开朗废话不多说,先将n-k个用四个柱从a移到b,再将剩余的k用三个柱从a移到d,再用四个柱把n-k从b移到d,至于k的大小需要建立一个状态方程看看口味多大事,所用时间最小#include<iostream>using namespace std;int ...原创 2011-08-20 13:35:07 · 779 阅读 · 0 评论 -
poj 1887 Testing the CATCHER dp 最大降序
这道题也没什么可说的,无疑感觉就是求连续降序,和最大降序的区别就是多加了一个for循环 #includeusing namespace std;int a[100000];int dp[100000];int main(){ int n,m; in原创 2011-08-19 15:33:54 · 519 阅读 · 0 评论 -
poj 1125 Stockbroker Grapevine 很好的一道floyd入门题
这道题虽然对大牛来说是floyd的水题,但我感觉作为入门题应给算是很好的一道题 floyd最值得注意的地方是中间变量放在for循环外围!!!这是由其算法本身所决定的,其每一步求出任意一对顶点之间仅通过中间节点1,2,...,k的最短距离,当1,2,...,k扩展到所有顶点原创 2011-08-18 14:43:00 · 901 阅读 · 0 评论 -
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, 1936, 1952, 1953, 1958, 1959, 1962, 19...原创 2011-08-17 19:37:21 · 1707 阅读 · 0 评论