2014年3月13日

LightOJ 1140: How Many Zeroes? (数位DP)

摘要: 当前数位DP还不理解的点:1:出口用i==0的方式2:如何省略状态d(就是枚举下一个数的那个状态。当然枚举还是要的,怎么把空间省了)总结:1:此类DP,考虑转移的时候,应当同时考虑查询时候的情况。2:考虑x在第i位之后,能遍历多少数字,其答案为(x%10i-1+1) 3:这里的记忆化搜索不太一样喔,出口一定要写在递归里,不然,查询状态下差到出口就会出错了~类型:数位DP题意:求[A,B]区间内的所有数,写下来之后,0的个数。(a,b 为 unsigned int)思路:我的笨拙暴力状态:dp[i][d][okPre] 表示d开头的i位数,(okPre表示计算前导0的情况下,反之~),的0的个数 阅读全文

posted @ 2014-03-13 21:52 ShineCheng 阅读(431) 评论(0) 推荐(0) 编辑

HDU 2089:不要62(数位DP)

摘要: 类型:数位DP题意:定义一个好的数为 没有出现“4”和“62” 这样的数。问[n,m]之间有多少这样的数。(0#include int dp[15][10];int num[120];int dfs(int i, int now, bool iscount) { if (!iscount && dp[i][now] != -1) return dp[i][now]; if (i == 1) { if (now == 4) return dp[i][now] = 0; else return dp[i][now] = 1; } int end ... 阅读全文

posted @ 2014-03-13 20:20 ShineCheng 阅读(153) 评论(0) 推荐(0) 编辑

HDU 4722:Good Numbers(数位DP)

摘要: 类型:数位DP题意:定义一个Good Number 为 一个数所有位数相加的和%10==0.问[A,B]之间有多少Good Number.方法:正常“暴力”的定义状态:(i,d,相关量)定义dp[i][d][mod] 为 d开头的i位数中,%10==mod的数的个数dp[i][d][mod] = sum(dp[i-1][0~9][(mod-d+10)%10]出口:dp[1][d][mod] = (d==mod);代码:#include #include #include #include using namespace std;long long dp[20][10][10];int num[ 阅读全文

posted @ 2014-03-13 20:13 ShineCheng 阅读(180) 评论(0) 推荐(0) 编辑

2014年3月12日

HDU 3709: Balanced Number (数位DP)

摘要: 类型:数位DP题意:定义平衡数为:以某位数为中心,左边的每位数*这个数离中心的距离 == 右边的每位数*这个数离中心的距离。问[x,y]之间有多少平衡数思路:做的莫名奇妙……定义:dp[i][d][k][b] 为 首位为d的i位数,以第k位为中心点,平衡因子为b的数的个数。平衡因子定义为,中心点右边的和-中心点左边的和。实际上这个状态定义冗余了。不需要定义首位d,同时,平衡因子如果定义成,之前所有数的加权和为b,那就不有写这么复杂了。唉,现在有点乱。理不清楚啊。#include #include #include #define BB 1000using namespace std;long 阅读全文

posted @ 2014-03-12 22:49 ShineCheng 阅读(155) 评论(0) 推荐(0) 编辑

2014年3月11日

HYSBZ 1026: windy数(数位DP)

摘要: 类型:数位DP题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。问[A,B]之间windy数的个数。(1 #include #include using namespace std;int num[100];long long dp[20][10][2];long long dfs(int i, int d, bool preAllZero, bool isQuery) { if (!isQuery && ~dp[i][d][preAllZero]) return dp[i][d][preAllZero]; if (i == 1) { return... 阅读全文

posted @ 2014-03-11 23:53 ShineCheng 阅读(408) 评论(0) 推荐(0) 编辑

HDU 3652:B-number(数位DP)

摘要: 亮点:收获:降一些时间复杂度可能带来编程复杂度。如果编程复杂度太高,而且时间允许的话,试着用一些冗余的状态来降低编程复杂度。查询和正常DP的差别就在于:查询的时候有限制(最大不能超过那个数),而正常的时候没有类型:数位DP题意:找1~n内有多少能被13整除且含“13”这个子串的数。方法:(我的,想的比较乱的方法)dp[i][d][mod] 表示d开头的i位数中含有“13”这个子串且%13==mod的数的个数则:那么下一个余数nextMod = ((mod-j*10i-1)%13+13)%13dp[i][d][mod] = 1) d != 1: ∑dp[i-1][j=(0~9)][nextMo. 阅读全文

posted @ 2014-03-11 22:01 ShineCheng 阅读(247) 评论(0) 推荐(0) 编辑

2014年3月10日

HDU 3555: Bomb (数位DP)

摘要: 类型:数位DP题意:求1~N内,含有49这个子串的数的个数。N#include #include using namespace std;long long dp[100][10];int num[30];void init() { for (int i = 0; i >N; long long ans = 0; long long tmp = N; int len = 0; while (tmp) { num[++len] = tmp%10; tmp/=10; } ... 阅读全文

posted @ 2014-03-10 16:42 ShineCheng 阅读(184) 评论(0) 推荐(0) 编辑

2014年3月9日

UPC 2219: A^X mod P

摘要: 题形:另类快速幂题意:f(x) = K, x = 1f(x) = (a*f(x-1) + b)%m , x > 1Now, Your task is to calculate( A^(f(1)) + A^(f(2)) + A^(f(3)) + ...... + A^(f(n)) ) modular P. 1 #include #include long long n, A, K, a, b, m, P;long long p1[100005], p2[100005];int main() { int t; scanf("%d", &t); int cas = 阅读全文

posted @ 2014-03-09 20:41 ShineCheng 阅读(237) 评论(0) 推荐(0) 编辑

2014年3月8日

ZOJ 2619: Generator

摘要: 类型:概率 + 解方程组(高斯消元法) + KMP(好吧其实我用的是暴力~)题意:你可以等概率的选择大写字母里的前n个字母,在纸上写啊写,一直到出现给定的字符串。问写的字母个数的期望。思路:期望递推法。(不过这里推出了个环……)下一个状态是看现在这个串,加上一个字母之后,能匹配到原串的哪里。(就是KMP里面的失配数组,写字符串的过程,就是一边写一边匹配)不过我KMP不太熟悉,就直接暴力了。。推完后发现,推出了一个环。怎么办,只能用高斯消元法来解这个方程组了。这题比较特殊,经过证明(我不会= =)可以得到,答案必定为整数。高斯消元法用double精度卡死(样例都过不了),用分数还是WA(可能溢出 阅读全文

posted @ 2014-03-08 21:18 ShineCheng 阅读(366) 评论(0) 推荐(0) 编辑

2014年3月7日

UVA - 10288 Coupons

摘要: 题形:概率DP题意:收集齐n个不同的优惠卷的期望开箱次数。(开一次箱子会等概率的得到其中一张优惠卷)思路:期望递推法。正常做就行。就是分数输出麻烦了点。e[i] = i/n(e[i]+1) + (n-i)/n(e[i+1]+1)然后移项,递推就行了。代码:#include #include #include #include using namespace std;#define N 50 struct fraction { long long numerator; // 分子 long long denominator; // 分母 fraction() { ... 阅读全文

posted @ 2014-03-07 16:15 ShineCheng 阅读(328) 评论(0) 推荐(0) 编辑

导航