丧杰1927 2024-07-08 09:23 采纳率: 25%
浏览 3
已结题

c++ 动态规划 最短路径

题目大意:
MM 参加一个滑雪比赛,滑雪场是一个 N×M 的矩形,MM 要从起点(1,1)滑到(N,M)。矩形中每个单位格子有一个海拔高度值 hi,从一个格子走到另一个格子速度就会变成 v*2(hi-hj),已知 MM 的初始速度是 v,请问最少需要多少时间。
输入格式:
第一行输入三个整数 V,N,M。
接下来 N 行 M 列描述滑雪场每个单位格子的海拔高度。
输出格式:
输出只有一行,表示从起点到终点的最少花费时间。答案保留 2 位小数。
样例输入:
1 3 3
1 5 3
6 3 5
2 4 3
样例输出:
29.00
数据范围:
1<=N,M<=100
-25<=hi<=25

我提交了一下要么时间超限,要么答案错误
我写一个动态规划的程序,但只有17分

#include<bits/stdc++.h>
using namespace std;
double v,minn=1e9,dp[101][101],vv[101][101];
int n,m,a[101][101];
int main()
{
    //freopen("skiing.in","r",stdin);
    //freopen("skiing.out","w",stdout);
    cin>>v>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            vv[i][j]=v;
    for(int i=2;i<=m;i++)
    {
        dp[1][i]=dp[1][i-1]+1/vv[1][i-1];
        vv[1][i]=vv[1][i-1]*pow(2,a[1][i-1]-a[1][i]);
    }
    for(int i=2;i<=n;i++)
    {
        dp[i][1]=dp[i-1][1]+1/vv[i-1][1];
        vv[i][1]=vv[i-1][1]*pow(2,a[i-1][1]-a[i][1]);
    }
    for(int i=2;i<=n;i++)
        for(int j=2;j<=m;j++)
        {
            int ans1=dp[i-1][j]+1/vv[i-1][j];
            int ans2=dp[i][j-1]+1/vv[i][j-1];
            if(ans1<ans2)
            {
                dp[i][j]=ans1;
                vv[i][j]=vv[i-1][j]*pow(2,a[i-1][j]-a[i][j]);
            }
            else
            {
                dp[i][j]=ans2;
                vv[i][j]=vv[i][j-1]*pow(2,a[i][j-1]-a[i][j]); 
            }
        }
    cout<<fixed<<setprecision(2)<<dp[n][m]<<endl;
    return 0;
}

img

我知道应该要用最短路径来写,可不知道怎么写,求改正方法!!!

来源:c++比赛题 skiing

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-07-08 09:24
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您好!很高兴您来寻求帮助。首先,我注意到您上传的文件中包含了一些测试结果,但似乎并没有直接提供代码中的错误信息。不过,根据您提供的代码和描述,我可以提供一些可能的问题和改进建议。

    可能的问题和错误:

    1. 数据类型错误:在您的代码中,dp 数组用于存储到达每个点的最小时间,但您使用了 double 类型。然而,在计算速度变化时,您使用了整数减法,这可能导致精度问题。建议使用 double 类型来存储海拔高度差,以保持精度。

    2. 速度更新逻辑:您的代码中速度更新逻辑似乎有误。速度应该是基于当前速度和海拔高度差的指数变化,而不是简单的乘法。公式应该是 new_speed = current_speed * pow(2, height_difference)

    3. 边界条件处理:在动态规划中,边界条件的处理非常重要。您的代码中对第一行和第一列的处理似乎是正确的,但请确保对所有边界条件都进行了正确的处理。

    4. 循环变量范围:在您的代码中,循环变量 ij 的范围是从 2 开始的,这意味着您跳过了第一行和第一列。这可能是导致答案错误的原因之一。

    5. 内存使用:根据您提供的测试结果,内存消耗似乎在可接受范围内,但如果您发现内存使用过高,可能需要考虑优化数据结构或减少不必要的内存分配。

    优化算法以避免超时问题:

    1. 减少不必要的计算:检查您的代码中是否有重复计算或可以预先计算的值。

    2. 使用更高效的数据结构:如果可能,使用更高效的数据结构来存储和访问数据。

    3. 空间优化:考虑是否可以使用滚动数组来减少内存使用,这在动态规划中是一种常见的优化技巧。

    4. 并行计算:如果问题允许,考虑使用并行计算来加速算法。

    正确实现最短路径的动态规划算法:

    1. 明确状态定义:定义 dp[i][j] 为从起点到点 (i, j) 的最少时间。

    2. 状态转移方程:对于每个点 (i, j),考虑从它的上方、左方以及左上方和右上方(如果可行)到达的最小时间,并更新 dp[i][j]

    3. 初始化:初始化 dp[1][1] 为 0,因为起点的时间是已知的。

    4. 边界条件:确保正确处理边界条件,特别是第一行和第一列。

    5. 循环顺序:通常,我们从外向内填充 dp 数组,即先填充第一行和第一列,然后是内部的点。

    6. 输出:最后,dp[n][m] 将包含从起点到终点的最少时间。

    参考链接:

    希望这些建议能帮助您改进代码并解决遇到的问题。如果您需要更具体的帮助,比如对代码的逐行分析,请随时告诉我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月23日
  • 已采纳回答 7月15日
  • 创建了问题 7月8日

悬赏问题

  • ¥15 centos7系统下abinit安装时make出错
  • ¥15 帮看看这个为何无法运行
  • ¥15 hbuildex运行微信小程序报错
  • ¥50 HAL ADCDMA单次触发转换
  • ¥15 关于#python#的问题:我知道这个问题对你们来说肯定so easy
  • ¥15 wpf datagrid如何实现多层表头
  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错