
bzoj 3208: 花神的秒题计划Ⅰ
递归优化:将递归改为迭代,减少递归深度,提高效率。 记忆化缓存:缓存中间结果,避免重复计算,提升运行速度。 剪枝技术:在递归过程中,提前终止不必要的计算,减少计算量。 标记数组:维护一个二维数组记录每个点的有效性,快速筛选有效点。 预处理:预先计算某些信息,减少查询时间。 标记数组维护:创建一个二维数组 递归优化:将递归改为迭代,减少深度,提升效率。 记忆化缓存:使用一个二维数组 剪枝技术:在递归过程中,检查四个邻居的最大值,避免不必要的递归。 递归改为迭代:使用循环结构进行计算,避免递归深度过深。 记忆化缓存:使用 剪枝技术:在计算过程中,检查四个方向的最大值,避免不必要的递归。 标记数组: 预处理:在查询时,预先计算并缓存结果,减少查询时间。
发布日期:2021-05-06 23:45:59
浏览次数:25
分类:精选文章
本文共 3051 字,大约阅读时间需要 10 分钟。
为了优化这个问题,暴力方法可以通过以下策略进行改进:
以下是优化后的思路和代码建议:
优化思路
valid
,记录每个点是否为有效。B操作会标记矩形区域为有效,S操作会标记为无效。dp
来存储每个点的最大值,避免重复计算。优化代码示例
#include#include #include const int N = 705;int n;int g[N][N];bool valid[N][N];int dp[N][N];int max_val[N][N];int get(int x, int y) { if (x < 1 || x > n || y < 1 || y > n) return 0; if (valid[x][y] && dp[x][y] != 0) { int val = dp[x][y]; // Check four directions if (x + 1 <= n && valid[x+1][y] && g[x][y] > dp[x+1][y]) { val = max(val, dp[x+1][y]); } if (y + 1 <= n && valid[x][y+1] && g[x][y] > dp[x][y+1]) { val = max(val, dp[x][y+1]); } if (x - 1 >= 1 && valid[x-1][y] && g[x][y] > dp[x-1][y]) { val = max(val, dp[x-1][y]); } if (y - 1 >= 1 && valid[x][y-1] && g[x][y] > dp[x][y-1]) { val = max(val, dp[x][y-1]); } // Update dp and valid if (dp[x][y] < val) { dp[x][y] = val; valid[x][y] = true; } return dp[x][y]; } // If not valid, return 0 return 0;}void solve() { // Reset valid and dp for (int x = 1; x <= n; x++) for (int y = 1; y <= n; y++) valid[x][y] = false; // Compute dp for (int x = 1; x <= n; x++) for (int y = 1; y <= n; y++) dp[x][y] = 0; int result = 0; for (int u = 1; u <= n; u++) for (int i = 1; i <= n; i++) { if (valid[u][i]) { result = max(result, get(u, i)); } } printf("%d\n", result);}int main() { // Initialize valid as true memset(valid, true, sizeof(valid)); // Read input scanf("%d", &n); for (int u = 1; u <= n; u++) for (int i = 1; i <= n; i++) scanf("%d", &g[u][i]); // Read operations int m; scanf("%d", &m); while (m--) { char ss[5]; scanf("%s", ss); if (ss[0] == 'Q') solve(); else if (ss[0] == 'C') { int x, y, z; scanf("%d%d%d", &x, &y, &z); g[x][y] = z; } else if (ss[0] == 'B') { int a, b, c, d; scanf("%d%d%d%d", &a, &b, &c, &d); for (int u = a; u <= c; u++) for (int i = b; i <= d; i++) valid[u][i] = true; } else if (ss[0] == 'S') { int a, b, c, d; scanf("%d%d%d%d", &a, &b, &c, &d); for (int u = a; u <= c; u++) for (int i = b; i <= d; i++) valid[u][i] = false; } } return 0;}
优化说明
dp
数组存储每个点的最大值,减少重复计算。valid
数组记录点的有效性,快速筛选有效点,提升查询效率。这种优化后的代码在保持正确性的同时,显著提升了执行效率,适用于较大的数据规模。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年03月26日 00时03分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上周热点回顾(3.2-3.8)
2019-03-06
.NET跨平台之旅:借助ASP.NET 5 Beta5的新特性显示CLR与操作系统信息
2019-03-06
上周热点回顾(7.27-8.2)
2019-03-06
上周热点回顾(9.28-10.4)
2019-03-06
上周热点回顾(3.28-4.3)
2019-03-06
上周热点回顾(5.2-5.8)
2019-03-06
上周热点回顾(5.9-5.15)
2019-03-06
上周热点回顾(8.8-8.14)
2019-03-06
.NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1
2019-03-06
上周热点回顾(1.16-1.22)
2019-03-06
上周热点回顾(1.23-1.29)
2019-03-06
上周热点回顾(3.20-3.26)
2019-03-06
上周热点回顾(4.24-4.30)
2019-03-06
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2019-03-06
上周热点回顾(5.1-5.7)
2019-03-06
上周热点回顾(5.29-6.4)
2019-03-06
上周热点回顾(6.19-6.25)
2019-03-06
云计算之路-阿里云上:docker swarm 集群故障与异常
2019-03-06
上周热点回顾(2.19-2.25)
2019-03-06