题目大意:
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;
}
我知道应该要用最短路径来写,可不知道怎么写,求改正方法!!!
来源:c++比赛题 skiing