当前位置: 首页 > news >正文

【CF】Day24——Codeforces Round 994 (Div. 2) D

D. Shift + Esc

题目:

思路:

典DP的变种

如果这一题没有这个变换操作,那么是一个很典型的二维dp,每一个格子我们都选择上面和左边中的最小值即可

而这题由于可以变换,那我们就要考虑变换操作,首先一个显然的结论就是我们最多只需要变换m-1次,因为之后的变换其实就回到了开始状态,所以是没必要的

这里我们就可以使用一个 dp[i][j][k] ,其定义为 (i,j) 位置在变换 k 次后的最小值

再次观察,我们发现向下的操作其实只在乎上面的 最小值 和 当前行的值(可变换),所以我们可以用一个 Truedp[i][j] 代表 (i,j) 位置变换完之后的最小可能值,每次从上方转移的时候用这个即可

代码注意变换操作的细节即可

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
using namespace std;
#define int long long
#define yes cout << "YES\n"
#define no cout << "NO\n"

int n, m, k;

int get(const vector<vector<int>>& a,int i, int j, int add)
{
    int tmp = (j + add) % m;
    return tmp == 0 ? a[i][m] : a[i][tmp];
}

void solve()
{
    cin >> n >> m >> k;
    vector<vector<int>> mp(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> mp[i][j];
        }
    }
    vector<vector<vector<int>>> dp(n + 1, vector<vector<int>>(m + 1, vector<int>(m+1,1e18)));
    vector<vector<int>> Truedp(n + 1, vector<int>(m + 1, 1e18));
    Truedp[0][1] = Truedp[1][0] = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            for (int x = 0; x < m; x++)
            {
                dp[i][j][x] = min(dp[i][j][x], Truedp[i - 1][j] + get(mp,i,j,x) + 1LL*x*k);
                dp[i][j][x] = min(dp[i][j][x], dp[i][j-1][x] + get(mp, i, j, x));
                Truedp[i][j] = min(Truedp[i][j], dp[i][j][x]);
            }
        }
    }
    cout << Truedp[n][m] << endl;
}

signed main()
{
    cin.tie(0)->sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

http://www.dtcms.com/a/112624.html

相关文章:

  • 常用性能指标(metrics)
  • 理解OSPF 特殊区域Stub和各类LSA特点
  • leetcode-链表+动规
  • idea如何让打开的文件名tab多行显示
  • Android studio进阶教程之(二)--如何导入高德地图
  • 超便捷语音转文字工具CapsWriter-Offline本地部署与远程使用全流程
  • 如何快速入门物联网单片机开发?
  • windows如何安装wkhtmltoimage 给PHP使用根据HTML生成图片
  • Mysql 中的 binlog、redolog、undolog
  • LayaAir3.3.0-beta.3重磅更新!Spine4.2、2D物理、UI系统、TileMap等全面升级!
  • 青少年编程与数学 02-015 大学数学知识点 09课题、专业相关性分析
  • 洛谷题单3-P5724 【深基4.习5】求极差 最大跨度值 最大值和最小值的差-python-流程图重构
  • css 文字换行每一个字渐变
  • go游戏后端开发25:红中麻将规则介绍
  • Modbus RTU与TCP通信示例
  • Docker 镜像相关的基本操作
  • CCF-CSP认证练习题-第19次-线性分类器
  • 分布式锁算法——基于ZooKeeper的分布式锁全面解析
  • 质检LIMS系统在水产养殖企业的应用 水产养殖企业的现状
  • Jmeter脚本录制
  • 软件工程(应试版)图形工具总结(一)
  • 【为什么基本数据类型不能存储在集合、泛型中?】
  • HTML语言的空值合并
  • 蓝桥杯专项复习——双指针
  • T-SQL语言的自动化运维
  • STM32单片机入门学习——第13节: [6-1] TIM定时中断
  • # 深入解析 C 语言中的 memcpy 与 memmove:内存操作的双雄
  • 深度学习项目--分组卷积与ResNext网络实验探究(pytorch复现)
  • Redis Cluster 在网络分区场景下的处理机制
  • Laravel是否足以支持高并发以及为何需要选择Hyperf或Gin