专栏文章
题解:P12613 [CCC 2025 Junior] Connecting Territories
P12613题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip3mg8r
- 此快照首次捕获于
- 2025/12/03 05:37 3 个月前
- 此快照最后确认于
- 2025/12/03 05:37 3 个月前
题目大意
给定一个 的网格。分别从左往右从上往下填上 至 的循环数列,问从第一行开始每次可以走左下,正下,右下,走到最后一行的最小值。
解题思路
考虑DP。
定义状态
用 表示从第一行走到第 行第 列经过路径的最小值。
分解子问题
其中 但是本题不建议用取模运算,会TLE,令一个变量 不断自增,若超过 就初始化为 。
边界状态
问题答案
效率分析
时间复杂度和空间复杂度都为 。
分析完发现 肯定炸空间了,观察转移方程当前行状态只会从上一行转移,并且答案只需要从最后一行的状态获取。考虑奇偶滚动数组优化。
代码实现
CPP#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll r, c, m, dp[2][20005], ans = 1e18, a;
int main() {
cin >> r >> c >> m;
memset(dp, 0x3f, sizeof dp);
for (int j = 1; j <= c; j++)
dp[0][j] = 0;
for (int i = 1; i <= r; ++i) {
int now = i & 1, bef = (i - 1) & 1; //当前行和上一行的奇偶
for (int j = 1; j <= c; ++j) {
a++;
if (a > m) a = 1;
dp[now][j] = min(dp[bef][j], min(dp[bef][j - 1], dp[bef][j + 1])) + a;
if (i == r) ans = min(ans, dp[now][j]);
}
}
cout << ans;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...