Graph Timus在线法官使用DP的TLE
我在解决问题。我用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 <
#包括
使用名称空间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;
}