随笔分类 -  动态规划

摘要:给n<=10^700,问1到n中每个数在各数位排序后得到的数的和。答案膜1e9+7。 一看就是数位DP啦。。然而并没有什么思路。。 可以尝试统计n(i,j)表示数j在第i位的出现次数,知道了这个数组后就可以算答案了。可以枚举j,做一次DP,f(a,b,0/1)--考虑第a~n个数,有b个j,是否大于 阅读全文
posted @ 2018-01-06 11:04 Blue233333 阅读(447) 评论(0) 推荐(0)
摘要:n<=20种东西,有个大小k<=n的箱子,每次会以固定的概率从所有东西里选一种,若箱子里有空位且这种东西没出现过就丢进去,若箱子满了且这种东西没出现过就把最早访问过的一个丢掉,(只要在每次操作最早的“挑一种物品”选中某个数都算“访问”)问10^100操作后每个数存在箱子里的概率。 由于操作过多,最后 阅读全文
posted @ 2018-01-03 14:09 Blue233333 阅读(291) 评论(0) 推荐(0)
摘要:t<=10000个问,每次问n<=1000的全排列中逆序数对为k<=10000个的有多少,mod 1e9+7。 直接dp,$f(i,j)$--i的全排列中逆序数对为j的有多少,$f(i,j)=\sum_{k=max(0,j-i+1)}^{j} f(i-1,k)$,这东西记个前缀和即可n^2。 然后就 阅读全文
posted @ 2017-12-22 21:59 Blue233333 阅读(139) 评论(0) 推荐(0)
摘要:日常刷水。。 n<=50000个数,把一段连续的数隔在一起的代价为$(x-L)^2$,其中$x=i-j+\sum_{k=j}^{i} A_k,j<=i$。问最小代价。 一开始看成除法然后浪费了20min(逃 瞎yy一下dp,$f(i)$--前i个数的最小分隔代价,$f(i)=min(f(j)+(s_ 阅读全文
posted @ 2017-12-22 21:46 Blue233333 阅读(164) 评论(0) 推荐(0)
摘要:n<=100000个<=100000的正数,其中有一些0表示这个位置的数字可以是L~R中的一个,L,R是给定常数且1<=L<=R<=100000,问最长上升子序列。 先暴力啊!$f(i,j)$表示前i个数中以j结尾的答案。$f(i,j)=f(i-1,j)$,$f(i,a_i)=max(f(i-1,j 阅读全文
posted @ 2017-12-21 16:45 Blue233333 阅读(232) 评论(0) 推荐(0)
摘要:n<=150个点,m<=150条路,每条路Ai,Bi,Di表示Ai到Bi有一条有向边,使用他前至少要走Di条路,问1到n最少走几条路。 又是n^4过150的题。。。。 不同于传统的最短路,这次的最短路包括了m个图,并且状态和走的路径数有关。所以要一个状态Can(i,j)表示能否到达点i走j步。 由于 阅读全文
posted @ 2017-12-13 14:17 Blue233333 阅读(381) 评论(0) 推荐(0)
摘要:n<=10000,n*2的格子玩扫雷,给下面一行的数字,问上面一行有几种方案。 ????我写的DP,貌似有更简洁的写法。。 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<stdlib.h> 5 // 阅读全文
posted @ 2017-12-05 13:10 Blue233333 阅读(173) 评论(0) 推荐(0)
摘要:n<=500000的序列和m<=500000的符号串,求最长的子序列,满足选中的数中第i个数和第i+1个数满足符号关系Si。 最长xx子序列--DP+树状数组。 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #inc 阅读全文
posted @ 2017-11-28 07:07 Blue233333 阅读(155) 评论(0) 推荐(0)
摘要:n<=100000天,一开始有s块钱,每天股票A价格ai,B价格bi,每天可以做的事情:卖出股票;按A:B=RTi的比例买入股票。问最后的最大收益。股票可以为浮点数,答案保留三位。 用脚指头想想就知道是:某一天全部买进来,某一天全部卖出去,没有说买一半卖一半的。 那就可以dp了,f(i)表示前i天最 阅读全文
posted @ 2017-11-22 21:28 Blue233333 阅读(173) 评论(0) 推荐(0)
摘要:n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<=n*n,ci<=1e5,现T<=1e5个询问:从Ai出发,带Yi<=n*n块钱走不少于Si<=1e9的路程,问最多剩多少钱。 方法 阅读全文
posted @ 2017-11-06 09:01 Blue233333 阅读(314) 评论(0) 推荐(0)
摘要:n<=250个大写字母和m<=250个小写字母,给p<=200个合法相邻字母,求用这些合法相邻字母的规则和n+m个字母能合成多少合法串,答案mod 97654321. 什么鬼膜数。。 f(i,j,k)--i个大写字母,j个小写字母,最后一个字母是k,,其中k是小写字母,p是能接在k前面的任意字母,k 阅读全文
posted @ 2017-10-26 19:15 Blue233333 阅读(210) 评论(0) 推荐(0)
摘要:n<=1e5个东西,从左往右买,有K<=16个钱,每次花一个钱买可以买多个,买完不找零,问所有买完最多剩多少钱,无解-1. 一开始以为物品要做状态一直想不出来。。。。 f(i)--钱的状态为i最多能买多少个东西,f(i)=从f(j)+1开始买能买到哪里,其中j是i某一位少一个1的状态。最多买多少,在 阅读全文
posted @ 2017-10-26 15:51 Blue233333 阅读(191) 评论(0) 推荐(0)
摘要:n<=1000分钟,每分钟会有一个苹果从树1或树2掉下,一开始在树1,最多换位置m<=30次,问最多能收到多少苹果。 F(i,j,0/1)--前i分钟在换位置j次,在树1/2: 1 #include<cstring> 2 #include<cstdlib> 3 #include<cstdio> 4 阅读全文
posted @ 2017-10-26 14:25 Blue233333 阅读(178) 评论(0) 推荐(0)
摘要:n<=3000个数划分成m段,每段的权值为这一段数字的和,求段的最小方差乘上m平方。 所以就是求上边那组平方和的最小值,这个可以dp,f(i,j)表示分成i段,前j个数最小方差, pre表示前缀和,这个式子可以用斜率优化或决策单调性解决。 1 #include<stdio.h> 2 #include 阅读全文
posted @ 2017-10-12 16:10 Blue233333 阅读(149) 评论(0) 推荐(0)
摘要:n个数,对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j))。 这就是要找max(Aj-Ai+sqrt(abs(i-j))向上取整。把他分成两部分,Max(Max (Aj+sqrt(i-j)) , Max (Ak+sqrt(k 阅读全文
posted @ 2017-10-11 16:59 Blue233333 阅读(227) 评论(0) 推荐(0)
摘要:n<=248个数字,可以进行这样的操作:将相邻两个相同的数字合并成这个数字+1,求最大能合成多少。 f(i,j)--区间i到j能合成的最大值,f(i,j)=max(f(i,k)+1),f(i,k)=f(k+1,j)。 1 #include<stdio.h> 2 #include<string.h> 阅读全文
posted @ 2017-10-02 14:30 Blue233333 阅读(145) 评论(0) 推荐(0)
摘要:n<=1000个牛塔,每塔30头牛,m<=1000个地点会使经过的牛塔少一头,K<=30个命令每次使所有牛塔往东西南北某方走一格,求最多损失多少牛并输出字典序最小的方案。 没看到K的范围想不出系列。。由于K<=30,不会出现牛负数的情况,所以直接搜,搜可能会搜到重复,那就记忆化,那不如直接写DP。 阅读全文
posted @ 2017-09-28 19:25 Blue233333 阅读(243) 评论(0) 推荐(0)
摘要:n<=100000个点m<=100000条边有向图,有一次机会沿着某条边反方向走一次,求从一号点出发最终到达一号点的路径经过的不同的点的数量的最大值。 tarjan缩完点,如果没机会反方向的话答案就是1所在的分量的大小。现在有了,其实就是1->1能到达的某个点->反向边->能到达1的某个点,所以只要 阅读全文
posted @ 2017-09-28 08:00 Blue233333 阅读(183) 评论(0) 推荐(1)
摘要:n<=1000个球在坐标系中从天上掉下,给每个球初始位置(Xi,Yi)和下落速度Vi,我从x0开始在x轴上走,走一个单位一秒,走到一处可以0秒射击一个横坐标相同的球,得分为球的当前纵坐标,求打完所有求最大得分/1000。 这是一种当前决策影响后续代价的DP,需要在某一步决策的同时把该决策对后面的影响 阅读全文
posted @ 2017-09-27 16:23 Blue233333 阅读(216) 评论(0) 推荐(0)
摘要:n<=500的树上有点权(有正负),选若干个点使点权和>=X(<=1e6)并且相邻点的对数最多,输出相邻点最多多少对。 在n个点里选某权和的最多相邻点->在n个点里选某数量的相邻点使权和最大 f(i,j,0/1)--子树i中选j对相邻关系,不选/选择节点i的最大权和, 就是个背包嘛。不过注意一下背包 阅读全文
posted @ 2017-09-27 15:20 Blue233333 阅读(371) 评论(0) 推荐(0)