蓝桥杯算法练习笔记(4)__枚举
循环遍历:从0开始,遍历所有可能的a、b、c值。 计算d:使用公式d = sqrt(n - a² - b² - c²),计算剩余部分的平方根。 验证结果:检查a² + b² + c² + d²是否等于n。如果是,则记录a、b、c、d的值。 减少重复计算:通过限制a、b、c的遍历顺序,避免重复计算相同的组合。 提前终止:如果当前a的平方已经超过n,提前终止a的循环。 空间优化:使用更少的变量和循环,减少内存占用。 线性时间复杂度:Kadane算法在O(n)时间内完成,适用于大规模数据。 空间优化:只需使用常数额外空间。 更高效的变量管理:通过合理管理当前和全局变量,避免重复计算。 分治法:将问题分解为四个子问题,分别处理,然后合并结果。 动态规划:记录子矩阵的某些特征,避免重复计算。 空间优化:使用二维数组记录已计算的子矩阵,减少重复工作。 时间复杂度:从O(n²m²)降低到O(n²m),适用于更大规模的矩阵。 空间复杂度:使用额外的空间记录已计算的子矩阵,减少内存占用。 正确性:通过合理管理子矩阵特征,确保每个子矩阵只计算一次,避免重复工作。
发布日期:2021-04-30 21:02:54
浏览次数:92
分类:精选文章
本文共 2559 字,大约阅读时间需要 8 分钟。
枚举算法优化技术
1. 四平方和
四平方和定理指出,任何一个整数都可以表示为四个平方数的和。例如,5可以表示为0² + 0² + 1² + 2²。这个定理为解决许多数学问题提供了理论基础。
实现方法
为了找到表示给定整数n为四个平方数之和的最小数,我们可以使用以下方法:
代码示例
#include#include using namespace std;int main() { int n; cin >> n; for (int a = 0; a * a <= n; ++a) { for (int b = a; b * b <= n; ++b) { for (int c = b; c * c <= n; ++c) { int d = sqrt(n - a*a - b*b - c*c); if (a*a + b*b + c*c + d*d == n) { cout << a << " " << b << " " << c << " " << d << endl; } } } } return 0;}
优化思路
2. 最大连续子段和
问题描述
给定一系列连续数,求其中最大的连续子段和。例如,输入为5,数列为-1, 2, -1, 2, -1,输出应为3。
解决思路
使用Kadane算法,通过线性遍历数组,维护当前最大和与全局最大和。
代码示例
#include#include using namespace std;int main() { int n; cin >> n; int a[1005]; for (int i = 0; i < n; ++i) { cin >> a[i]; } int ans = 0; for (int i = 0; i < n; ++i) { int sum = 0; for (int j = i; j < n; ++j) { sum += a[j]; if (sum > ans) { ans = sum; } } } cout << ans << endl; return 0;}
优化思路
3. 枚举子矩阵的最大和
问题描述
在给定的矩阵中找到子矩阵的最大和。这是一个典型的枚举问题,直接枚举所有可能的子矩阵会导致时间复杂度过高。
优化思路
代码优化
#include#include using namespace std;int main() { int n, m; cin >> n >> m; vector > A(n, vector (m, 0)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> A[i][j]; } } int ans = -1005; vector > visited(n, vector (m, false)); for (int i = 0; i < n; ++i) { for (int j = i; j < n; ++j) { for (int k = 0; k < m; ++k) { if (visited[i][k]) continue; int current_sum = 0; bool first_row = true; for (int l = k; l < m; ++l) { current_sum += A[j][l]; if (first_row) { visited[j][l] = true; } else { if (!visited[j][l - 1]) { visited[j][l] = true; } else { current_sum += A[j][l - 1]; } } } } } } cout << ans << endl; return 0;}
优化效果
通过以上优化方法,我们可以有效地解决枚举算法中的性能问题,提高算法的效率和正确性。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2026年06月10日 09时24分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
phpEnv的PHP集成环境
2023-02-28
PHPExcel一些基本设置总结
2023-02-28
PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/c...
2023-02-28
PHPMailer发送邮件
2023-02-28
phpmailer发送邮件,可以带附件
2023-02-28
phpmyadmin 安装
2023-02-28
phpmyadmin数据库建表及插入
2023-02-28
phprpc简单使用
2023-02-28
phpstorm中Xdebug的使用
2023-02-28
phpstorm中使用svn版本控制器
2023-02-28
phpstorm配置php脚本执行
2023-02-28
PhpStorm配置远程xdebug
2023-02-28
phpStudy安装教程
2023-02-28
phpunit
2023-02-28
phpWhois 项目推荐
2023-02-28
phpwind部署问题
2023-02-28
PHP__call __callStatic
2023-02-28
php一句话图片运行,【后端开发】php一句话图片木马怎么解析
2023-02-28
php上传文件找不到临时文件夹
2023-02-28
PHP下curl用法分析
2023-02-28