/* DP is obvious. For more information, see Mr Wu wenhu's program design basics. However, this question card memory is directly enabled.
The array of 1000*1000 will exceed. Then someone in discuss said that DP [2] [1000] would be fine, and then press
Train of Thought.
If (diagonally [I-1] [J-1])
DP [1] [J] = min (DP [0] [J], DP [1] [J-1]) + 100, DP [0] [J-1] + 100 * SQRT (2.0 ));
Else
DP [1] [J] = min (DP [0] [J], DP [1] [J-1]) + 100;
For each row calculated, DP [0] [...] = DP [1] [...];
Finally, DP [1] [M + 1] is output.
My code :*/
# Include <iostream>
# Include <cstdio>
# Include <cstring>
# Include <cmath>
Using namespace STD;
Const int n= 1005;
Const double di = 100 * SQRT (2.0 );
Double P [2] [N];
Bool diagonally [N] [N];
Int main (){
// Freopen ("data. In", "r", stdin );
Int n, m, K, I, J;
While (~ Scanf ("% d", & N, & M )){
Memset (diagonally, 0, sizeof (diagonally ));
Memset (p, 0, sizeof (p ));
N ++; m ++;
Scanf ("% d", & K );
While (k --){
Scanf ("% d", & I, & J );
Diagonally [I] [J] = true;
}
For (I = 1; I <= m; I ++)
P [0] [I] = (I-1) * 100;
For (I = 2; I <= N; I ++ ){
P [1] [1] = (I-1) * 100;
For (j = 2; j <= m; j ++ ){
If (diagonally [I-1] [J-1])
P [1] [J] = min (P [0] [J], p [1] [J-1]) + 100, P [0] [J-1] + DI );
Else
P [1] [J] = min (P [0] [J], p [1] [J-1]) + 100;
}
For (j = 1; j <= m; j ++)
P [0] [J] = P [1] [J];
}
Printf ("% d \ n", INT (P [1] [m] + 0.5 ));
}
Return 0;
}