Graph Timus在线法官使用DP的TLE

Graph Timus在线法官使用DP的TLE,graph,dynamic-programming,shortest-path,Graph,Dynamic Programming,Shortest Path,我在解决问题。我用DP解决了它,但我得到了TLE。我不知道如何做得更好。救命啊 #包括 使用名称空间std; 双dis[1005][1005]; mapm; int N,M,K; 双分钟(双a,双b){ if(a>M>>N; cin>>K; dis[0][0]=0; 对于(inti=1;i把问题看错了,我声称,通过三角不等式,对角线到达一个街区的距离小于向右和向上移动的距离。! 我将很快提交并解释。我认为他没有必要穿过所有对角线到达点(N,M)。他只会使用必要的对角线。 #include <

我在解决问题。我用DP解决了它,但我得到了TLE。我不知道如何做得更好。救命啊

#包括
使用名称空间std;
双dis[1005][1005];
map,int>m;
int N,M,K;
双分钟(双a,双b){
if(a>M>>N;
cin>>K;
dis[0][0]=0;

对于(inti=1;i把问题看错了,我声称,通过三角不等式,对角线到达一个街区的距离小于向右和向上移动的距离。!
我将很快提交并解释。

我认为他没有必要穿过所有对角线到达点(N,M)。他只会使用必要的对角线。
#include <bits/stdc++.h>

using namespace std;

double dis[1005][1005];

map< pair< int, int >, int > m;

int N, M, K;

double min( double a, double b ){

    if( a < b )
        return a;

    return b;
}

int main(){

    cin >> M >> N;

    cin >> K;

    dis[0][0]= 0;

    for( int i= 1; i<= N; ++i )
        dis[i][0]= 100*i;

    for( int j= 1; j<= M; ++j )
        dis[0][j]= 100*j;

    for( int i= 0, x,y; i< K; ++i ){

        scanf( "%d%d", &x, &y );
        m[{y,x}]++; 
    }

    double shortcut= sqrt(20000);

    for( int i= 1; i<= N; ++i )
        for( int j= 1; j<= M; ++j ){

            //cout << i << " " << j << "\n\t";

            if( m[{i,j}] > 0 ){

                dis[i][j]= min( dis[i-1][j-1] + shortcut , min(   
                                    dis[i-1][j] , dis[i][j-1] ) + 100 ) ;

                m[{i,j}]--;

            }else{

                dis[i][j]= min( dis[i-1][j], dis[i][j-1] ) + 100;

            }

        }

    cout << ceil(dis[N][M]) << endl;

}