70分求调

P1434 [SHOI2002] 滑雪

Cy6206 @ 2024-11-30 12:41:02

70分代码,不知道哪里出问题了,大佬帮帮本蒟蒻吧

#include<iostream>
#include<algorithm> 
using namespace std;
const int N=101;
int mx[N][N],f[N][N];
int main(){
    int n,m,ans=0;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>f[i][j];
            mx[i][j]=1;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(f[i-1][j]<f[i][j]&&i>0) mx[i][j]=max(mx[i][j],mx[i-1][j]+f[i][j]-f[i-1][j]);
            if(f[i+1][j]<f[i][j]&&i<n-1) mx[i][j]=max(mx[i][j],mx[i+1][j]+f[i][j]-f[i+1][j]);
            if(f[i][j-1]<f[i][j]&&j>0) mx[i][j]=max(mx[i][j],mx[i][j-1]+f[i][j]-f[i][j-1]);
            if(f[i][j+1]<f[i][j]&&j<n-1) mx[i][j]=max(mx[i][j],mx[i][j+1]+f[i][j]-f[i][j+1]);
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(ans<mx[i][j]) ans=mx[i][j];
        }
    }
    cout<<ans;
    return 0;
}

by Arefa @ 2024-11-30 13:41:43

  1. 题目要求的是路径长度,每经过一个点,路程加一,而不是加上高度差。
  2. 对于每个点,只有当,它四周的点中,比它低的点为起点的最大路程都计算好了,计算该点为起点的最大路程才会正确。

    例如:对于

4 3
1 2

而言,以 4 为起点时,最长路径应该为 4。但是如果我们最先计算该点的路径长度,由于此时以 3 为起点和以 2 为起点的最长路径都是初始值 1,因此我们会计算得到以 4 为起点的路径长为 1+1=2。

解决方法:将每个点按高度从小到大排序,按这个顺序依次进行计算。


by Cy6206 @ 2024-12-04 14:13:48

谢谢大佬


|