zoukankan      html  css  js  c++  java
  • cf1072D. Minimum path(BFS)

    题意

    题目链接

    给出一个(n imes n)的矩阵,允许修改(k)次,求一条从((1, 1))((n, n))的路径。要求字典序最小

    Sol

    很显然的一个思路是对于每个点,预处理出从((1, 1))到该点最多能经过多少个(1)

    然后到这里我就不会做了。。

    接下来应该还是比较套路的吧,就是类似于BFS一样,可以枚举步数,然后再枚举向下走了几次,有点分层图的感觉。

    /*
    */
    #include<bits/stdc++.h> 
    #define Pair pair<int, int>
    #define MP(x, y) make_pair(x, y)
    #define fi first
    #define se second
    //#define int long long 
    #define LL long long 
    #define rg register 
    #define pt(x) printf("%d ", x);
    #define Fin(x) {freopen(#x".in","r",stdin);}
    #define Fout(x) {freopen(#x".out","w",stdout);}
    using namespace std;
    const int MAXN = 2001, INF = 1e9 + 10, mod = 1e9 + 7, B = 1;
    const double eps = 1e-9;
    inline int read() {
        char c = getchar(); int x = 0, f = 1;
        while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x * f;
    }
    int N, K, vis[MAXN][MAXN], f[MAXN][MAXN];
    char s[MAXN][MAXN];
    int main() {
        N = read(); K = read();
        for(int i = 1; i <= N; i++) scanf("%s", s[i] + 1);
        for(int i = 1; i <= N; i++) {
            for(int j = 1; j <= N; j++) {
                f[i][j] = max(f[i - 1][j], f[i][j - 1]);
                if(s[i][j] == 'a') f[i][j]++;
                if(i + j - 1 - f[i][j] <= K) s[i][j] = 'a';
            }
        }
        putchar(s[1][1]); vis[1][1] = 1;
        for(int i = 3; i <= N << 1; i++) {//all step
            char now = 'z' + 1;
            for(int j = 1; j < i; j++) { // num of down
                if(j > N || (i - j > N)) continue;
                if(!vis[j - 1][i - j] && !vis[j][i - j - 1]) continue;
                now = min(now, s[j][i - j]);    
            }
            putchar(now);
            for(int j = 1; j < i; j++) { // num of down
                if(j > N || (i - j > N)) continue;
                if(!vis[j - 1][i - j] && !vis[j][i - j - 1]) continue;
                if(s[j][i - j] == now) vis[j][i - j] = 1;   
            }       
        }
        return 0;
    }
    /*
    
    */
    
  • 相关阅读:
    pip安装软件时出现Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build*的解决方案
    tidb安装
    TIDB 5.0 安装体验 怎么快速玩起来
    利用Tampermonkey(油猴)+ IDM 实现百度云盘大文件下载(IDM安装教程)
    python字典及相关操作
    【转载】CEO:我需要什么样的产品经理?
    2014年3月第三周/第一次跳槽、心情低潮期、与老总沟通问题
    hello word!
    function(event)中的event详解
    CSS 伪类
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/9826881.html
Copyright © 2011-2022 走看看