zoukankan      html  css  js  c++  java
  • [CF1353F] Decreasing Heights

    Description

    给定一个 (n imes m) 的矩阵,从 ((1,1)) 走到 ((n,m)),每次只能从权值为 (x) 的位置走到权值为 (x+1) 的位置,初态下可以对若干个格子进行一些操作,每次使得一个格子的权值减小 (1)。求最少要操作多少次使得存在合法的路径。

    Solution

    如果路径上第一个点的权值确定,那么整条路径的权值也随之确定。

    因此我们暴力枚举第一个点的权值 (h) 然后 dp 即可。

    (f[i][j]) 表示到达 ((i,j)) 为止花费的最小代价。

    如果 (a[i][j]<h+i+j-2),则非法,直接令 (f[i][j] o infty)

    否则,需要花费 (a[i][j]-h-i-j+2),从 ((i-1,j))((i,j-1)) 转移过来。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long 
    const int N = 105;
    
    int f[N][N],n,m,a[N][N];
    
    int calc(int h)
    {
        memset(f,0x3f,sizeof f);
        f[1][1]=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(i==1 && j==1) continue;
                f[i][j]=min(f[i-1][j],f[i][j-1]);
                if(a[i][j]>=h+i+j-2)
                {
                    f[i][j]+=a[i][j]-h-i-j+2;
                }
                else 
                {
                    f[i][j]=1e18;
                }
            }
        }
        return f[n][m];
    }
    
    void solve()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
            }
        }
        int ans=1e18;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(a[1][1]>=a[i][j]-i-j+2) ans=min(ans,calc(a[i][j]-i-j+2)+a[1][1]-a[i][j]+i+j-2);
            }
        }
        cout<<ans<<endl;
    }
    
    signed main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            solve();
        }
    }
    
  • 相关阅读:
    陈应松《母亲》
    黄灯:一个农村儿媳眼中的乡村图景
    喝完茶为什么嘴里是甜的
    俗语一千条
    XtraBackup完整备份与增量备份的原理
    李嘉诚:90%考虑失败 关注细节
    redo和undo的区别
    tar命令
    自增锁引发的悲剧
    各版本 MySQL 并行复制的实现及优缺点
  • 原文地址:https://www.cnblogs.com/mollnn/p/13958642.html
Copyright © 2011-2022 走看看