我尝试使用这种方法解决问题http://www.spoj.com/problems/CPCRC1C/ 在讨论中 http://goo.gl/YzEwXR
这是我对上述算法的实现
void solve(int i, bool lo, bool hi, char *A, char *B, int n, unsigned long long &sum,int numSum) {
if (i == n) {
sum+=numSum;
return;
}
char d = hi ? '0' : A[i];
char end = lo ? '9' : B[i];
for (; d <= end; d++) {
int nnumSum=numSum ;
nnumSum += (d-48);
// cout<<"\nd="<<d<<" sum="<<nnumSum;
solve(i + 1, lo || d < B[i], hi || d > A[i], A, B, n, sum,nnumSum);
}
}
你能建议我如何使用记忆优化算法吗?
非常感谢你的时间
答案 0 :(得分:0)
CPCRC1C
1) sum of digits from 1 to b, let this count be sum(b)
2) sum of digits from 1 to a-1, let this count be sum(a-1)
返回两次计数之间的差异
如何计算sum(x)? 让我们尝试找出一种模式
什么是sum(9)?
1 2 3 4 ........... 9
9*10/2 = 45
什么是总和(19)? sum(9)+以下数字中的数字之和
10 11 12 13 ....... 19
10 + 9*10/2 = 10 + 45 [10 is sum of first digit in all numbers]
什么是总和(29)? sum(19)+以下数字中的数字之和
20 21 22 23 ........29
20 + 9*10/2 = 20 + 45
什么是总和(100)?
45 + (10 + 45) + (20 + 45) + (30 + 45) + ..... (90 + 45)
45*10 + (10 + 20 + 30 ... 90)
45*10 + 10(1 + 2 + ... 9)
45*10 + 45*10
45*20
我们可以使用上面的模式来提出一个可以直接计算和的公式