![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP专题
文章平均质量分 73
流風回雪_YZK
只盼来日登蜀道..
展开
-
SGU103+POJ 1158 最短路/dp
题意:一个无向图,求起点到终点最少时间,限制:每个路口有灯,要灯颜色一样才能过去,灯之有俩种颜色,周期变化,给定每个灯初态,时间。思路:开始就想到直接DP,方程dp[k]=dp[i]+distance[i][k]+waittime(i,k),于是天真得BFS敲了这个,SB啊!有些点松弛了,之后它又被松弛,它便还可以松弛别人啊!否则世界上最短路O(n)的算法就诞生了!所以,一旦某个点原创 2014-04-04 17:41:56 · 853 阅读 · 0 评论 -
hdu5945 bc#89 dp+单调队列优化
简单题。很久没写题目了,今天一打,果然手生。单调队列都不会写了。(一年没更新了)题意:一个数字x,每次俩种操作选一种:1,如果能被k整除,可以x=x/k, 2 .x=x-j (j=0,1,2,,,,t) ,求使得x=1的最少操作步数,题目保证有解。解:if(j%k==0) dp[ j]=min(dp[j],dp[j/k]+1) or dp[j]=min(dp原创 2016-10-30 21:31:18 · 359 阅读 · 0 评论 -
hdu5501 变价值的01背包
题意,n选做部分题,题价值会根据时间降低,每题有初始分,下降速度,做题时间。#include#include#includeusing namespace std;struct zz{ int c; int b; double k; int s;};bool my (zz a ,zz b){ return a.k<b.k;原创 2015-10-12 16:46:13 · 515 阅读 · 0 评论 -
状态压缩dp poj 3254 hdu5045
#include#includeusing namespace std;int n,m;int dp[5000][15];int yu[5000];int numstate=0;int fib[15];void init() //n行m列,状态一行推一行{ scanf("%d%d",&n,&m); int maxs=(1<<m);原创 2014-10-07 10:20:49 · 1001 阅读 · 1 评论 -
hdu5009 离散化+dp+优化
西安网络赛C题。先对大数据离散化,dp优化#include //G++#include#include#include#include#include#include#includeusing namespace std;const int maxn=51234;struct kind{ int id; int val;};int vis原创 2014-09-15 19:11:12 · 1026 阅读 · 0 评论 -
hdu 4791 dp预处理+二分
题意: 打印东西,给出区间(张数)对应费用(到达一定张数就都按某更低的价格),m次询问,问最优费用。给的时候按张数递增给的。dp出当前张数到最后的最小值。对于询问q,然后二分处》=q的最小的一个张数的价格。min(这个价格*p,dp[这+1])即可。nlogn;后来看网上有些人用线段树,没必要的。ps:开始竟然因为犯中间数据爆int的初级错误!,不该不该!#include#inclu原创 2014-09-05 18:44:58 · 825 阅读 · 0 评论 -
hdu 2686 费用流 / 双线程DP
题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左。俩种解法:1 费用流法:思路转化:从左上角流出2的流量,(表示走俩条路),归于右下角,可以走就有边(右和下),权为负的费用,源点连起点,汇点连终点,流量为2. 除源汇外所有点一分为2,Y向X对应点有流量1的边,之前边为X到Y的(原图)原创 2014-07-28 19:45:25 · 937 阅读 · 0 评论 -
hdu 4632 子字符串统计的区间dp
题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数。简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就知道了,若已经知道【0,i】,推【0,i+1】, 显然还要从i+1 处往回找,dp方程也简单: dp[j][i]=(dp[j+1][i]+dp[j][i-1]+10007-dp[j+1][i-1])%10007;原创 2014-08-03 11:44:30 · 1036 阅读 · 0 评论 -
汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI、汉诺塔VII
/* 先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,现在要搬到目标C上,规则小的必需放在大的上面,每次搬一个,求最小步数。这个问题简单,DP:a[n]=a[n-1]+1+a[n-1],先把上面的n-1个放在B上,把最大的放在目标C上,再把N-1个放回到C上即可。现在是汉若塔II,改为四个塔,开始方程想简单了,不是最优的。网上的一种最优解法如下:(1)原创 2014-07-10 11:14:39 · 2563 阅读 · 0 评论 -
SPOJ 1479 +SPOJ 666 无向树最小点覆盖 ,第二题要方案数,树形dp
题意:求一颗无向树的最小点覆盖。 本来一看是最小点覆盖,直接一下敲了二分图求最小割,TLE。 树形DP,叫的这么玄乎,本来是线性DP是线上往前\后推,而树形DP就是在树上,由叶子结点状态向根状态推。 dp[u][1/0]:表示,结点u,1:选择,0,:不选。dp值是以改点为根(目前为止,dfs遍历顺序自然决定了树的层)的已经选择点数,自然开始时不知道,对每个点,初值原创 2014-03-21 17:41:00 · 1072 阅读 · 0 评论 -
SGU104 二维dp
大致题意: n个东西放在(1.2.3.。。m)个容器中,先放的必需在后方的左边。a[i][j]表示i号物品放在j容器所得的价值,求最大价值。几乎是刚刚开始接触动态规划题,开始我这样想 每个东西一件一件放,dp[k]表放k物品时候已经到达最大值dp[k]=dp[k-1]+max(放k物品所得到最大值),这样想想不行,如果现在放最大值未必最大啊。百度一下,发现别人用二维数组,我马上想想原创 2014-04-04 20:24:11 · 801 阅读 · 0 评论 -
取数比最大博弈题:判断是否必胜
题意:一个数组,从左往右取数,A和B轮流取数,每次只能取1或者2个,最后和大的获胜,A先取,问是否必胜。解法:从后往前推: dp【i】表 先手相对后手的最优值(), dp[i] = max (v[i]-dp[i+1] , v[i]+v[i+1]-dp[i+2] ) 最后判断是否大于0即可。再看类似leetcode 486. Predict the Winner原创 2017-09-13 23:47:09 · 901 阅读 · 0 评论