牛客小白月赛27 C

分析

对于这张图的关键点非常少,对于每一个点对我们可以求出之间的距离,我们考虑状压转移。 ,表示节点 为根节点,已经走过的节点集合为 所需要的最小步数。总的复杂度为 表示有多少个坏掉的电线杆。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 210,inf = 0x3f3f3f3f;
#define LL long long
struct Node{int x,y;}p[21];
int vis[N][N];
int dp[N][101000];int n,m,t,top,f[21][21];
char ch[N][N];
int dx[4] = {0,0,-1,1},dy[4] = {1,-1,0,0};
void solve(int id) {
    memset(vis,inf,sizeof(vis));vis[p[id].x][p[id].y] = 0;
    queue<Node> q;q.push((Node){p[id].x,p[id].y});
    while(q.size()) {
        Node x = q.front();q.pop();
        for(int i = 0;i < 4;i++) {
            int X = x.x + dx[i],Y = x.y + dy[i];
            if(vis[X][Y] != inf||X < 1||Y < 1||X > n||Y > m||ch[X][Y] == '#') continue;
            vis[X][Y] = vis[x.x][x.y] + 1;
            q.push((Node){X,Y});
        }
    }
}
int main()
{
    cin >> n >> m >> t;
    int sx,sy;
    for(int i = 1;i <= n;i++) {
        for(int j = 1;j <= m;j++) {
            cin >> ch[i][j];
            if(ch[i][j] == 'S') sx = i,sy = j;
            if(ch[i][j] == 'T') p[++top] = (Node){i,j};
        }
    }
    p[++top] = (Node){sx,sy};
    for(int i = 1;i <= top;i++) {
        solve(i);
        for(int j = 1;j <= top;j++) {
            f[i][j] = vis[p[j].x][p[j].y];
        }
    }
    memset(dp,0x3f,sizeof(dp));
    dp[top][1<<top-1] = 0;
    for(int s = 1;s < (1<<top);s++) {
        for(int j = 1;j <= top;j++) {
            if(((s>>j-1)&1) && dp[j][s] != inf) {
                for(int i = 1;i <= top;i++) {
                    if((s>>i-1)&1) continue;
                    dp[i][(s|(1<<i-1))] = min(dp[j][s] + f[j][i],dp[i][s|(1<<i-1)]);
                }
            }
        }
    }
    int ans = inf;
    for(int i = 1;i <= top;i++) ans = min(ans,dp[i][(1<<top)-1] + f[i][top]);
    if(ans == inf) cout << "-1" << endl;
    else cout << ans + 1LL * (top-1) * t << endl;
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-23 17:32
那如果是字节外包呢?据我所知工牌无区别&nbsp;可以晒出去装X的那种
秋盈丶:残酷的是,都一样,管你是不是字节,不过我是很反对这种的,本是同根生,市场行情决定了用工的模式会有很多外包,分层只是单纯为了筛选
点赞 评论 收藏
分享
程序员饺子:正常 我沟通了200多个 15个要简历 面试2个 全投的成都的小厂。很多看我是27直接不会了😅
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务