数字和与倍数 UVA 11361

本文深入解析了一道关于数位DP的复杂题目,介绍了如何通过递归算法和记忆化搜索来解决大范围内的数字筛选问题。文章详细阐述了递推公式的建立及其实现过程,并附带完整的代码示例。

这一道题目弄了两天,终于对数位dp有了新的理解.

参考了一个大佬的代码大佬的博客
题目大意:
给定,,a,b,k.找出所有满足在a<=x<=b条件的整数,要求能被k整除,数位之和也能被k整除。
分析
递推题目的第一步大致相同,设f(x)表示不超过x的非负整数中满足条件的个数。那么我们所求答案便是f(b)-f(a-1);问题的关键就在于如何计算f函数.假设我们需要计算f(12345)就是要数一数在0~12345范围内有多少满足要求的数,由于题目中给的范围很大,一一枚举是不可能的,我们得想办法"取巧",白书上介绍的方法是使用加法原理,分段求和。

每一段都可以使用一个包含若干固定前缀和用星号表示的"后缀"的模板。其中星号表示可以人选用一个数字。
设f(d,m1,m2)表示 共d个数字,其中各个数字之和除以k的余数为m1,这些数字组成的整数除以k的余数为m2;

递推公式
f(d,m1,m2)={sum(f(d-1,(m1-x)mod k,(m2-10d-1)mod k|x=0,1,2,……9};

#include<iostream>
#include<algorithm>
#include<string.h>
#define maxn 105
using namespace std;

typedef long long ll;
ll  num[20];
int di[15], a, b, k, n;
int d[15][maxn][maxn], vis[15][maxn][maxn];


void pow_10() {
	num[0]=1;
	for (int i = 1; i <= 15; i++)
		num[i]=num[i-1]*10;
}
int dp(int cur, int m1, int m2, bool judge) {
	int &ans = d[cur][m1][m2];
	if (vis[cur][m1][m2]&&!judge)  return ans;    //记忆搜索如果是上届不可以按照平常方式一样返回    
	int ans0=0;                                    //备用
	vis[cur][m1][m2] = 1;
	if (cur == 0) {                   //出口
		if (m1 == 0 && m2 == 0)   
			return ans=1;
		return ans=0;
	}
	for (int i = 0; i < (judge ? di[cur] : 10); i++) {     //当上一位触及到上界时,该位置也必须进行约束
	 ans0+= dp(cur - 1, (m1 + i) % k, (m2 + i * num[cur - 1]) % k, false);
	}
	if (judge)    //触及上界,单独处理
		ans0+= dp(cur - 1, (m1 + di[cur]) % k, (m2 + di[cur] * num[cur - 1]) % k, true);
	if (!judge)  ans = ans0;     //如果是上界因为单独处理,需要判断
	return ans0;
}
int solve(int nu) {
	if (nu == 0)  return 1;
	n = 0;
	while (nu) {
		di[++n] = nu % 10;
		nu /= 10;
	}
	return dp(n, 0, 0, true);
}

int main() {
	int t;
	cin >> t;
	while (t--) {
		memset(d, 0, sizeof(d));
		memset(vis, 0, sizeof(vis));
		cin >> a >> b >> k;
		pow_10();
		if (k > 100) { cout << 0 << '\n'; continue; }
		int bb = solve(b);
		int aa = solve(a-1);
		cout << solve(b) - solve(a - 1) << '\n';
	}
	return 0;
}
【无人机】基于改进粒子群算法的无人机路径规划研究[遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究改进中。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值