洛谷 P3133 [USACO16JAN] Radio Contact G

题目描述

FJ 失去了他最喜欢的牛铃,而 Bessie 已经同意帮助他找到它!他们用不同的路径搜索农场,通过无线电保持联系。

不幸的是,无线电中的电池电量不足,所以他们设法尽可能保持两者位置的距离最小,以节省电量。

FJ 从位置(fx​,fy​) 开始,并计划遵循由 N 步组成的路径.Bessie 从位置 (bx​,by​) 开始,并遵循由 M 步组成的路径。每个步骤都是 N(北),E(东),S(南),或W(西)。其中,东方向为 x 轴正方向,北方向为 y 轴正方向。两个路径可以经过相同的点。

在每个时间段,FJ 可以不移动,也可以沿着他的道路前进一步。无论哪个方向恰好在下一个(假设他还没有到达他的路径的最后位置)。Bessie 可以做出类似的选择。

在每个时间点(不包括从初始位置开始的第一步),他们的无线电消耗的能量等于它们之间距离的平方。

请帮助 FJ 和 Bessie 计划行动策略,使双方达到各自终点时,最大限度地减少消耗的能量总量。输出所消耗的最小的能量。

输入格式

第一行两个整数 N 和 M (1≤N,M≤1000)。

第二行两个整数 fx​ 和 fy​。

第三行两个整数 bx​ 和 by​ (0≤fx​,fy​,bx​,by​≤1000)。

下一行为一个长度为 N 的字符串,描述 FJ 的路径。

最后一行为一个长度 M 的字符串,描述 Bessie 的路径。

输出格式

共一行一个整数,表示最小能量。

显示翻译

题意翻译

输入输出样例

输入 #1复制

复制代码
2 7
3 0
5 0
NN
NWWWWWN

输出 #1复制

复制代码
28
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int f[N][N];
int n,m;
struct node{
    int x,y;
}a[N],b[N];
int dist(int i,int j)
{
    return (a[i].x-b[j].x)*(a[i].x-b[j].x)+
            (a[i].y-b[j].y)*(a[i].y-b[j].y);
}
int main()
{
    cin>>n>>m;
    cin>>a[0].x>>a[0].y;
    cin>>b[0].x>>b[0].y;
    for(int i=1;i<=n;i++)
    {
        char ch;
        cin>>ch;
        if(ch=='N')
        {
            a[i]={a[i-1].x,a[i-1].y+1};
        }else if(ch=='E')
        {
            a[i]={a[i-1].x+1,a[i-1].y};
        }else if(ch=='W')
        {
            a[i]={a[i-1].x-1,a[i-1].y};
        }else
        {
            a[i]={a[i-1].x,a[i-1].y-1};
        }
    }

    for(int i=1;i<=m;i++)
    {
        char ch;
        cin>>ch;
        if(ch=='N')
        {
            b[i]={b[i-1].x,b[i-1].y+1};
        }else if(ch=='E')
        {
            b[i]={b[i-1].x+1,b[i-1].y};
        }else if(ch=='W')
        {
            b[i]={b[i-1].x-1,b[i-1].y};
        }else
        {
            b[i]={b[i-1].x,b[i-1].y-1};
        }
    }
    //初始化
    for(int i=1;i<=n;i++)
    {
        f[i][0]=f[i-1][0]+dist(i,0);
    }
    for(int j=1;j<=m;j++)
    {
        f[0][j]=f[0][j-1]+dist(0,j);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+dist(i,j);
        }
    }
    cout<<f[n][m];
    return 0;
}
相关推荐
李老师讲编程21 分钟前
中国电子学会图形化2020.12月Scratch三级考级题
算法·scratch·信息学奥赛·图形化编程·scratch素材
退休倒计时41 分钟前
【每日一题】LeetCode 53. 最大子数组和 TypeScript
数据结构·算法·leetcode·typescript
旖-旎43 分钟前
FloodFill(图像渲染)(1)
c++·算法·深度优先·力扣
戴西软件1 小时前
戴西 DLM 许可授权管理系统:破解无网络环境下工业软件授权难题,助力制造企业降本增效
网络·人工智能·python·深度学习·程序人生·算法·制造
2601_961875241 小时前
法考资料2026|全套|资料已整理
数据结构·算法·链表·贪心算法·eclipse·线性回归·动态规划
无限码力1 小时前
美团研发岗 4月18号笔试真题 - 坐标
算法·美团笔试真题·美团笔试题·美团研发岗笔试题·美团研发岗4月18号真题
有点。2 小时前
C++倍增法(练习题)
c++·算法
智者知已应修善业3 小时前
【51单片机8位数码管同时倒计时从9999】2024-1-25
c++·经验分享·笔记·算法·51单片机
洛水水3 小时前
【力扣100题】86.柱状图中最大的矩形
算法·leetcode·职场和发展