摘要: (如此简短的题目给人一种莫名的压迫感......) 题目中定义一个数的权值求解函数:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. 观察可知:权值的表达式与数的位数相关,再加上要分离每个位上的数字,那么就不难想到数位DP了。 dp[po 阅读全文
posted @ 2022-06-24 21:50 YHXo 阅读(24) 评论(0) 推荐(0)
摘要: 用dp[pos][val][cnt]表示状态,pos是数位,val是当前统计的数字,cnt是目前统计的目标数字的出现次数 注意状态的转移过程,统计数字0时前导0的影响。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 us 阅读全文
posted @ 2022-06-24 21:25 YHXo 阅读(55) 评论(0) 推荐(0)
摘要: 在二进制数上进行数位DP,在dp数组中就记录num0和num1,方便递归到边界时判断该数是否为round number,是则加1。 套用记忆化递归模板: 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int dp[40 阅读全文
posted @ 2022-06-24 19:48 YHXo 阅读(29) 评论(0) 推荐(0)
摘要: 和HDU2089差不多,但是本题是求包含某个数的个数,采用代码第15行的方式实现,当然,也可以求不包含的个数,最后用总数减去也可以得到答案。 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 typedef long lo 阅读全文
posted @ 2022-06-24 19:22 YHXo 阅读(38) 评论(0) 推荐(0)
摘要: 本题是数位DP的入门题,可以用来浅浅了解一下这种强大的计数类工具。 以下代码是采用记忆化递归的写法,效率很高。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int a[20] 阅读全文
posted @ 2022-06-24 18:58 YHXo 阅读(27) 评论(0) 推荐(0)
摘要: dp[u][0]表示u向下走的最大距离; dp[u][1]表示u向下走的次大距离; dp[u][2]表示u向上走的最大距离; 最后的答案就是每个点的max(dp[u][0],dp[u][2]); 求解次大距离并记录idx在求解向上最大距离中是有必要的,可以画图分析。 1 #include<cstdi 阅读全文
posted @ 2022-06-24 18:28 YHXo 阅读(37) 评论(0) 推荐(0)
摘要: 本题属于不定根的树形DP,若以每个节点为根求解一次,复杂度太高,所以可以用换根的技巧。 d[u]表示以u为根向下可以流的最大流量,这个是比较好求的,直接遍历到叶子节点,由子节点信息更新父节点。然后进行第二次遍历,从上往下,子节点的信息由父节点更新。 这就是换根法的基本思路。 本题转移方程还是比较好想 阅读全文
posted @ 2022-06-24 18:07 YHXo 阅读(40) 评论(0) 推荐(0)