状态表示:dp[i][j] 当FJ走到第 i 步,Bessie走到 j 步事消耗的最小能量。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int jl(int x , int y , int x2 , int y2){
return abs(x-x2) * abs(x-x2) + abs(y-y2) * abs(y-y2);
}
int n , m , fx , fy , bx , by , dp[1005][1005];
int fxn[1005] , bxn[1005] , fyn[1005] , byn[1005];
signed main(){
cin >> n >> m;
cin >> fx >> fy >> bx >> by;
fxn[0] = fx , fyn[0] = fy , bxn[0] = bx , byn[0] = by;
for(int i=1;i<=n;i++){
char c;cin >> c;
if(c=='E')fxn[i] = ++fx , fyn[i] = fy;
else if(c=='S')fxn[i] = fx , fyn[i] = --fy;
else if(c=='W')fxn[i] = --fx , fyn[i] = fy;
else fxn[i] = fx , fyn[i] = ++fy;
}
for(int i=1;i<=m;i++){
char c;cin >> c;
if(c=='E')bxn[i] = ++bx , byn[i] = by;
else if(c=='S')bxn[i] = bx , byn[i] = --by;
else if(c=='W')bxn[i] = --bx , byn[i] = by;
else bxn[i] = bx , byn[i] = ++by;
}
for(int i=1;i<=n;i++)dp[i][0] = jl(fxn[i],fyn[i],bxn[0],byn[0]);
for(int i=1;i<=m;i++)dp[0][i] = jl(fxn[0],fyn[0],bxn[1],byn[1]);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==0&&j==0)continue;
dp[i][j] = min({dp[i-1][j-1],dp[i][j-1],dp[i-1][j]}) + jl(fxn[i],fyn[i],bxn[j],byn[j]);
}
}
cout << dp[n][m];
return 0;
}