- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划优化按位DP
1 按位DP 2 用各种工具优化DP 单调队列、树状数组、线段树。。。 3 根据决策单调优化DP 4 根据凸单调性优化DP 5 背包 * 动态规划 PPT的主要内容 按位DP-数位统计问题 常见的问题类型 求区间[A,B]之间满足某种性质的个数(总和、最值) 性质1:合法即可 性质2:不含前导零且相邻两个数字之差至少为2的正整数(windy数) 性质3:单峰数(Mountain Number) 性质4:双峰数(Bi-peak Number) 其它各种变形 按位DP-数位统计问题 方法1:统计[0,A-1]之间的个数ansa,统计 [0,B]之间的个数ansb,答案为ansb-ansa。 方法2:直接统计区间[A,B]之间符合答案的个数。 以单峰数为例: 按位DP-数位统计问题 思路:先确定高位的数,再确定低位的数。 状态:dp[pos][d][u][last][state]: pos表示已经确定了pos位以上的,当前要确定第pos位的数字。 d表示是否曾经大于下界。 u表示是否曾经小于上界。 last表示上一位的数字是多少。 state表示当前处于哪个状态。 3 2 2 3 1 0 按位DP-数位统计问题 实例:统计[123,34567]之间的单峰数。 l[]=32100.r[]=76543 .不足位数,高位补0 memset(dp,-1,sizeof(dp)); len=4; ans=dfs(len,0,0,0,0); 下面就是dfs代码 LL dfs(int pos,int d,int u,int last,int s){ if (pos0){ if (s==3) return 1; return 0; }//终态 int st=d?0:l[pos]; int ed=u?9:r[pos]; LL ans=dp[pos][d][u][last][s]; if (ans!=-1) return ans;//记忆化 ans=0; for(int i=st;i=ed;i++){//枚举第pos位是哪个数字 if (s==2){ if (ilast) ans+=dfs(pos-1,d||il[pos],u||ir[pos],i,2); if (ilast) ans+=dfs(pos-1,d||il[pos],u||ir[pos],i,3); } } return ans; } 用各种工具优化DP之单调队列 实例: Robotruck 机器人要将一些邮件按顺序分发到n个位置。每个位置的邮件数量为num[i],坐标为(Xi,Yi)。机器人有一个包,容量为C。每一个来回,机器人可以将一些位置的邮件全部放入包中(不超过C),从邮局出发,按顺序分发,之后返回邮局(坐标0,0)。时间花费为机器人走的路径长度总和。两点之间的路径长度为两点的哈密顿距离。问机器人将n个位置的邮件全部分发完的最小花费。 用各种工具优化DP之单调队列 len[i]表示坐标i到原点的距离 s[i]表示从第一个点按顺序走到第i个点的总路径长度 sc[i]表示从第一个点按顺序到第i个点的总邮件数 dp[i]表示走到第i点,并且从i点返回邮局的最小花费 len[0]=s[0]=s[1]=sc[0]=0; len[i]=x[i]+y[i]; s[i]=s[i-1]+abs(x[i]-x[i-1])+abs(y[i]-y[i-1]); sc[i]=sc[i-1]+num[i]; dp[i]=min{dp[j]+len[j+1]+sum[i]-sum[j+1]+len[i]}; =min{dp[j]+len[j+1]-sum[j+1]}+{len[i]+sum[i]}; =min{f[j]}+g[i].(sc[i]-sc[j]=c); 用各种工具优化DP之单调队列 一般形式 dp[i]=min(f[j])+g[i],(l[i]=j=r[i]) 能用单调队列解决的情况 l[i]和r[i]都单调不减(最常见的) 维护方式4步: 第一步:将小于l[i]的j剔除队列(队头) 第二步:对dp[i]赋值 第三部:将新的元素加入队列(指r[i]j=r[i+1]) 第四步:维护队列单调(队尾) 用各种工具优化DP之树状数组、线段树 当l[i]和r[i]不单调时,怎么办? 1、l[i]=0;转移方程为dp[i]=min{f[j]}+g[i],0=j=r[i]。 仔细观察,这其实就是求区间[ 0 , r[i] ]的最
文档评论(0)