10分,救救我!
查看原帖
10分,救救我!
1025109
ggpw_XNW楼主2025/1/15 08:19

状态表示:dp[i][j]dp[i][j] 当FJ走到第 ii 步,Bessie走到 jj 步事消耗的最小能量。

#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;
}
2025/1/15 08:19
加载中...