Codeforces Round 994 (Div. 2)-D题

题目链接:https://codeforces.com/contest/2049/problem/D

题目大意是在开始移动之前,可以任意次将一行元素向左挪一格,代价是1,开始游戏后,只能向下走或者向右走,直到走到终点,问最小代价是多少.

cpp 复制代码
constexpr ll inf = 1E18;
void solve() {
    int n, m, K;
    std::cin >> n >> m >> K;
    std::vector<std::vector<int>>a(n, std::vector<int>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            std::cin >> a[i][j];
        }
    }
    std::vector<ll>dp(m, inf);
    dp[0] = 0;
    for (int i = 0; i < n; i++) {
        std::vector<ll>ndp(m, inf);
        for (int j = 0; j < m; j++) {
            auto g = dp;
            for (int k = 0; k < m; k++) {
                if (k) {
                    g[k] = std::min(g[k], g[k - 1]);
                }
                g[k] += a[i][(j + k) % m];
                ndp[k] = std::min(ndp[k], g[k] + 1LL * j * K);
            }
        }
        dp = std::move(ndp);
    }
    std::cout << dp[m - 1] << "\n";
}

dp[k]表示走到第i列的最小代价,枚举每一行i,此时dp[k]表示走到(i-1,k)的最小代价,现在我们想要求走到(i,k)的最小代价,我们知道它可以由(i,k-1)和(i-1,k)转移过来,在k=0的时候(i,k-1)不存在,我们直接跳过,那么它的状态只能是从(i-1,k)转移过来,也就是dp[k]表示的值,由于我们要多次修改dp的值,所以每一次都要复制一份新的dp,用g来表示,j表示我们在开始的时候让第i行向左偏移了多少次,那么此时第(i,k)位置的元素变成了a[i][(j+k)%m],为了方便理解不妨把省略的行号列出来,此时g[0]表示的其实是g[i-1][0],我们枚举的偏移量,那么如果它向下走,加上一个a[i][(j+k)%m]变成了g[i][0],然后,我们再来计算g[1],此时g[1]表示的是g[i-1][1],注意此时g[0]表示的是g[i][0],那么g[i][1]可以由

min(g[i-1][1]+a,g[i][0]+a)转移而来,所以代码中g[k]=min(g[k],g[k-1])的操作其实是计算

g[i-1][k],g[i][k-1]的最小值,然后加上一个a,ndp表示在尝试所有偏移量j以后计算而来的第i的最小值,然后还给dp,然后不断重复这一部分操作即可.

相关推荐
高洁011 天前
DNN案例一步步构建深层神经网络(二)
人工智能·python·深度学习·算法·机器学习
aini_lovee1 天前
改进遗传算法求解VRP问题时的局部搜索能力
开发语言·算法·matlab
老蒋新思维1 天前
反脆弱性设计:创始人IP与AI智能体如何构建愈动荡愈强大的知识商业|创客匠人
人工智能·网络协议·tcp/ip·算法·机器学习·创始人ip·创客匠人
Salt_07281 天前
DAY 36 官方文档的阅读
python·算法·机器学习·github
明洞日记1 天前
【VTK手册027】VTK 颜色连续映射:vtkColorTransferFunction 深度解析与实战指南
c++·图像处理·算法·vtk·图形渲染
B_lack0261 天前
西门子PLC结构化编程_线性插值算法功能块
算法·pid·西门子plc·博途·线性插值·开环控制
fufu03111 天前
Linux环境下的C语言编程(四十三)
linux·c语言·算法
业精于勤的牙1 天前
三角形最小路径和(二)
算法
风筝在晴天搁浅1 天前
hot100 239.滑动窗口最大值
数据结构·算法·leetcode
夏乌_Wx1 天前
练题100天——DAY31:相对名次+数组拆分+重塑矩阵
数据结构·算法