Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
193893 luckypet 抄近路 C++ 解答错误 0 0 MS 256 KB 1238 2025-05-27 14:20:15

Tests(0/9):


#include <iostream> #include <vector> #include <cmath> #include <algorithm> using namespace std; int main() { int N, M, K; cin >> N >> M >> K; // 标记可以走对角线的方块 vector<vector<bool>> park(N+1, vector<bool>(M+1, false)); for(int i=0; i<K; i++) { int x, y; cin >> x >> y; park[x][y] = true; } // DP数组,存储到每个点的最短距离 vector<vector<double>> dp(N+1, vector<double>(M+1, 0)); // 初始化第一行和第一列 for(int i=1; i<=N; i++) dp[i][1] = (i-1)*100.0; for(int j=1; j<=M; j++) dp[1][j] = (j-1)*100.0; // 动态规划填表 for(int i=2; i<=N; i++) { for(int j=2; j<=M; j++) { // 常规移动:从左边或上边来 double min_dist = min(dp[i-1][j], dp[i][j-1]) + 100.0; // 如果可以走对角线,考虑从左上角来 if(park[i-1][j-1]) { min_dist = min(min_dist, dp[i-1][j-1] + 141.421356); } dp[i][j] = min_dist; } } // 四舍五入输出结果 cout << (int)(dp[N][M] + 0.5) << endl; return 0; }


测评信息: