随笔分类 -  动态规划--数位dp

摘要:规定sum[i] 为i里面含1的个数 ,求从1-N sum[i]的乘积。数为64位内的,也就是sum[i] 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using ... 阅读全文
posted @ 2014-07-02 19:24 _雨 阅读(218) 评论(0) 推荐(0)
摘要:链接这题纠结了好久,刚开始想到的是正解,不过想到可能会出现一个数支点不唯一的情况,这样就多算了,其实是我想多了,一个数只有一个支点。这样就好像想到了,枚举支点的位置,保存力矩的状态。dp[i][k][s] i为当前处理位 k为支点 s为到目前为止根据支点算出来的部分力矩。有一点需要注意算0的时候 会... 阅读全文
posted @ 2014-04-23 20:59 _雨 阅读(183) 评论(0) 推荐(0)
摘要:链接这题有一点小坑点 就是AX^B A只能为0或者1 ,剩下的就比较好做的了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using na... 阅读全文
posted @ 2014-04-23 15:32 _雨 阅读(204) 评论(0) 推荐(0)
摘要:链接这个题因为总和加起来是比较小的9*9 = 81 这样可以保留前面枚举的数对所有的可能出现的和的余数,然后依次向下找。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include ... 阅读全文
posted @ 2014-04-23 15:29 _雨 阅读(307) 评论(0) 推荐(0)
摘要:链接与前面几个类似,多开几维处理他的要求。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 #de... 阅读全文
posted @ 2014-04-23 15:27 _雨 阅读(207) 评论(0) 推荐(0)
摘要:链接 这题当时在网络赛时很费劲的推出来的,以递推的形式写出来的,一些边界点特别不好控制,靠看数据改出来的。现在改出dfs形式,也是很简单的。因为f(x)的数不会很大,直接保留前面枚举的数得出的结果即可。 1 #include 2 #include 3 #include 4 #include 5 ... 阅读全文
posted @ 2014-04-23 15:25 _雨 阅读(413) 评论(0) 推荐(0)
摘要:链接与上一个类似,更简单一些,标记前面是否出现过49和4. 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace st... 阅读全文
posted @ 2014-04-23 15:22 _雨 阅读(258) 评论(0) 推荐(0)
摘要:链接题意求能够整除和包含13的数字。这个比较简单,保留余数及1,然后标记前面是否出现过13就行。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10... 阅读全文
posted @ 2014-04-23 15:20 _雨 阅读(235) 评论(0) 推荐(0)
摘要:链接这个题最不好想到的是状态的保存,也没有几亿的数组让你开,怎么保存前面出现了哪些数字。题意让你求最长上升子序列的长度为k的数字的数目,可以是不连续的,可以保留一个状态栈,栈顶部依次更新,再保证长度最大的情况下使栈顶元素最小,这样就能保证下次加进来的元素有可能会使长度增加。这个状态就用2进制来表示,... 阅读全文
posted @ 2014-04-23 15:18 _雨 阅读(277) 评论(0) 推荐(0)
摘要:数位dp中不错的题目求能够整除自身各位数字的数,那换句话来说也就是能够整除各位数的最小公倍数,可以算出1-9所有数字的最小公倍数为2000+从高位向下走的时候,要保留当前第几位i,当前lcm,以及前面对lcm的余数r,不过这个lcm是变换的,状态无法保存。可以看下这个式子 x%m = x%(2*m)... 阅读全文
posted @ 2014-04-23 15:10 _雨 阅读(319) 评论(0) 推荐(0)
摘要:通常的数位dp写法int dfs(int i, int s, bool e) { if (i==-1) return s==target_s; if (!e && ~f[i][s]) return f[i][s]; int res = 0; int u = e?num[i]:... 阅读全文
posted @ 2014-04-20 21:42 _雨 阅读(269) 评论(0) 推荐(0)
摘要:转自http://blog.csdn.net/zhaoxinfan/article/details/8707605下面先给出数位DP的背景:•在给定区间[A,B]内,找满足要求的数。•要求一般和数大小无关,而与数的组成有关•例如,递增的,1234, 2579…• 双峰的,19280,26193…• ... 阅读全文
posted @ 2014-04-17 19:30 _雨 阅读(363) 评论(0) 推荐(0)
摘要:由简单到稍微难点。从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用。点开即可看题解。hdu3555 Bombhdu3652 B-numberhdu2089 不要62hdu4734 F(x)hdu4389 X mod f(x)ural1057 Amount of D... 阅读全文
posted @ 2014-04-17 19:25 _雨 阅读(254) 评论(0) 推荐(0)
摘要:链接也算是组合 以前按组合做过一次 忘记怎么做的了这次按dp写的 dp[i][j][g][k] 表示第i位为k(0|1)而且有j个1,g个0的情况数貌似写的麻烦了。。。这一类的题,进行逐位计算就可以 不过要很细心,边界处理 特殊情况处理什么的 。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 #define N 10000012 #define LL long long13 #define I. 阅读全文
posted @ 2014-04-04 21:36 _雨 阅读(230) 评论(0) 推荐(0)
摘要:链接好久没写这种逐位计数的了。先统计出总的数 ,s-n+1,倒着计算的 ,感觉倒着比较符合计算方式,总数为15*A(15,i) (1==n的 就找到了 该字符串的长度 然后再逐位进行找下一位 首位不为0. 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 #define N 10000012 #define LL long long13 #define INF 0xfffffff14 const . 阅读全文
posted @ 2014-04-03 23:21 _雨 阅读(200) 评论(0) 推荐(0)
摘要:4427dp[i][j][k] i为K位的最小公倍数 j为k位的和 k以滚动数组的形式这题最棒的是 有一个强有力的剪枝 组成公倍数m的肯定都是M的质因子 这样1000里面最多就30多个 复杂度可过了 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define mod 1000000007 9 int dp[1010][1010][2];10 int q[110][1010],f[1010],lc[1010][1010];11 int p[1010];12 . 阅读全文
posted @ 2013-10-31 10:11 _雨 阅读(244) 评论(0) 推荐(0)
摘要:第一眼就想到DP,然后想了N久就想不到可以不重算的DP 最后没办法了 先算出来 再去重。。因为最多只有三个 对于三个来说有三种组合情况 x+y+z, x*y*z, x*y+z 那要么 x,y,z都不同 要么 有两个相同 要么有三个相同 对都不同情况我的DP结果会重复两次 对于有两个相同的会重复一次 统计出都相同的 两个相同的 最后减掉。。有点乱 不过A了先预处理 时间差不多4S多 再O(1)询问 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL l... 阅读全文
posted @ 2013-09-23 14:42 _雨 阅读(836) 评论(2) 推荐(1)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4734各种不细心啊 居然算的所有和最大值会小于1024.。。第二次做数位DP 不是太熟 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define LL __int64 9 int dp[15][10500],dp2[15][10500];10 int a,b;11 int pp[20];12 void init()13 {14 int i,j,g;15 ... 阅读全文
posted @ 2013-09-14 20:23 _雨 阅读(907) 评论(0) 推荐(0)
摘要:链接这题规律其实挺明显的 打表找规律估计都可以 正规点就是DP算出第N位所包含的good number的数量 如果给出的数是N+1位 就枚举各位上比原来小的数 加上下一位的dp值一个i写成g了 纠结了半天。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL __int64 8 LL dp[20][20],a,b,pp; 9 void init()10 {11 int i,j,g;12 for(i = 0 ; i = 1 ; i--)34 ... 阅读全文
posted @ 2013-09-11 20:58 _雨 阅读(197) 评论(0) 推荐(0)