UVa 11361 Investigating Div-Sum Property

本文解析了一道数位DP入门题目,旨在求解区间内同时满足数位和及自身均为特定数k倍数的整数数量。文章详细介绍了状态定义、空间优化策略,并提供了完整的C++代码实现。

一个不错的数位dp入门题

求区间[a,b]中满足各个数位之和是k的倍数且这个数本身也是k的倍数的数的个数
数据范围 : 1a,b231,1k10000

一个不错的数位dp入门题

感觉这题如果要想清楚的话,还是要明确的定义一下dp的状态
dp[pos][m][ms]为前缀剩下的长度为pos,前缀modk为m,前缀的数位和modk为ms的时候,接在那样的前缀的后面使得总的数字能符合题意的数的个数
(如果不能理解的话,可以多读两遍

这个题还有一个问题就是如果你dp的第三维是按照k的大小开的话,需要O(log10(231)×k2)的空间复杂度,显然是开不下的

但是仔细想想,其实第三维完全不用开这么大,因为虽然我们存的是modk的值,但是题目范围内的数的数位和其实只有floor(log10(231))×990,所以第三维只要开到100就够了

其实这个题还有一个优化,只要k超过90,我们都可以O(1)时间内得出答案,留作习题(想一想,为什么

不管对不对,反正这就是我对数位dp的理解了(笑


                           我是代码的昏割线

#include<bits/stdc++.h>
using namespace std;

const int maxn = 11234;
int k;
int dp[12][maxn][108];
int dig[12];

int dfs(int pos,int mod,int mods,bool lim)
{
    if(pos < 0) return mod==0 && mods==0;
    int &ndp = dp[pos][mod][mods];
    if(!lim && ndp!=-1) return ndp;
    int ret = 0;
    int bound = lim ? dig[pos] : 9;
    for(int i=0; i<=bound; i++)
    {
        ret += dfs(pos-1,(mod*10+i)%k,(mods+i)%k,lim && i == bound);
    }
    if(!lim)
        ndp = ret;
    return ret;
}

int cal(int n)
{
    int len = 0;
    while(n)
    {
        dig[len++] = n % 10;
        n /= 10;
    }
    return dfs(len-1,0,0,true);
}

int main()
{
    int T;
    int a,b;
    scanf("%d",&T);
    while(T-- && ~scanf("%d %d %d",&a,&b,&k))
    {
        memset(dp,-1,sizeof(dp));
        printf("%d\n",cal(b)-cal(a-1));
    }
    return 0;
}
研究双层优化在学习和视觉中的应用,是为了改善学习算法和视觉系统的性能。在学习和视觉任务中,我们通常面临两个层面的优化问题。 第一层优化问题涉及到学习算法的优化,即如何通过合适的学习算法来获得最佳的模型参数。学习算法的优化过程通常涉及到定义损失函数和选择合适的优化方法。然而,常规的优化方法在高维问题中可能会面临挑战,导致在学习过程中陷入局部最优解。因此,研究者们开始探索使用双层优化方法来改进学习算法的性能。双层优化方法通过引入内部优化循环来进一步更新学习算法中的超参数,以改善模型性能。这种方法可以更好地探索参数空间,寻找更优的模型参数,从而提高学习算法的效果。 第二层优化问题涉及到视觉任务的优化,即如何通过图像处理和计算机视觉算法来解决具体的视觉问题。视觉任务可以包括目标检测、图像分割、姿态估计等多个方面。传统的视觉算法通常是通过定义特定的目标函数并使用迭代方法来进行优化。然而,这种方法可能会受到参数选择和初始条件的限制。因此,研究者们开始研究使用双层优化技术来提高视觉任务的性能。双层优化方法通过引入内部优化循环来逐步调整算法超参数和模型参数,以更好地适应特定的视觉任务。 总之,研究双层优化在学习和视觉中的应用,旨在改善学习算法和视觉系统的性能。这种方法可以通过优化学习算法的参数和模型参数,以及优化视觉任务的目标函数和算法参数,来改进学习和视觉的效果。这将有助于在学习和视觉领域取得更好的结果和应用。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值