如何使用动态编程解决问题

时间:2013-06-26 07:40:40

标签: c++

这是一个指向spoj问题problem

的链接

我是解决Dp问题的初学者。

虽然我发现了一些模式..但我无法以有效的方式表达它。

我尝试了天真的方法,但这肯定会给TLE。

void cal(int *a,int n)
{
    while(n!=0)
    {
         a[n%10]++;
         n/=10;
    }
}

void print(int *a)
{
    int ans=0;
    for(int i=1;i<=9;i++)
    {
            ans+=i*a[i];
    }
    printf("%d\n",ans);
}

然后从较大的数字中减去较小的no的总和。并添加下限的数字之和.. 即a = 12 b = 15

SUM1 = 51 SUM2 = 66

ans = 66-51 +(12 = 1 + 2的数字之和)= 15 + 3 = 18

任何帮助都会有所帮助。提前付款。

1 个答案:

答案 0 :(得分:0)

我会尝试给你一些提示,而不是为你解决整个问题:

  • 不要编写一个计算区间[a,b]中的和的函数,而是编写一个函数来计算区间[0,x]中的总和而不是:

    SUM([a,b]) = SUM([0, b]) - SUM([0, a-1])
    
  • 为了计算达到给定限额L的数字之和,对于每个数字d,计算在{{1}之前的所有数字中作为数字满足的次数}。要做到这一点,计算L显示为单位数字的次数,显示为十位数的次数,依此类推。