CF2049D 题解

news/2024/12/21 15:21:48/文章来源:https://www.cnblogs.com/Hanggoash/p/18620795

CF2049D 题解

题意

给定一个 \(n\times m\) 的数字矩阵和常数 \(K\),初始位于 \((1,1)\) 点,只能通过向下或者向右走来到达 \((n,m)\) 点。

存在某种操作,可以选择任意一行 ,将其所有列元素逆时针旋转 \(1\) 个单位,这个操作可以对任意行进行任意次(下面称这个操作为“旋转”)。

设最后总操作次数为 \(x\),经过的所有元素和为 \(S\),最后的代价就是 \(K\times x+ S\),求出这个代价可能的最小值。

注意:所有“旋转”操作需要在出发之前确定,或者等效来讲,不可以在某一行上移动时,对该行进行“旋转”操作。

分析

这个问题很明显可以 DP,并且有两个显然的观察:

  1. 每一行的旋转与否、旋转的次数是彼此之间独立的。
  2. 任意一行的旋转次数不会超过 \(m-1\) 次,否则就是无用功。

那么就可以很自然的得到 DP 的定义:\(dp[i][j][k],k\in[0,m-1]\) 为 到达 \((i,j)\) 点,当前行旋转了 \(k\) 次的最小代价。

那么对于某个点 \((i,j)\),其只会从 \((i-1,j)\)\((i,j-1)\) 转移。

\((i-1,j)\) 转移的时候,完全可以不用关心 \(i-1\) 行旋转了多少次,正如上文 “1” 所说,行与行之间的旋转操作是独立的,我只需要知道到达 \((i-1,j)\) 这个点的最小代价即可,这一过程可以通过在 DP 过程中随手记录下最小值实现。

\((i,j-1)\) 转移的时候,\(dp[i][j][k]\) 仅可从 \(dp[i][j-1][k]\) 转移,这一点在 “注意” 中已经指出。

那么这样一来整个流程就明了了,唯一需要再额外注意的地方在于可能会有数据溢出的情况。

Code

#include<bits/stdc++.h>
using namespace std;
int T,n,m,k;
const int N=2e5+10;
typedef long long ll;
const ll INF=1e15+1;
ll a[300][300];
inline ll get(int i,int j,int add)
{int tmp=(j+add)%m;return tmp==0?a[i][m]:a[i][tmp];
}
inline void solve()
{cin>>n>>m>>k;for(int i=1;i<=n;++i) for(int j=1;j<=m;++j)cin>>a[i][j];vector<vector<vector<ll>>> dp(n+1,vector<vector<ll>>(m+1,vector<ll>(m+1,INF)));vector<vector<ll>>mdp(n+1,vector<ll>(m+1,INF));mdp[0][1]=mdp[1][0]=0;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){for(int x=0;x<=m-1;++x){dp[i][j][x]=min(dp[i][j][x],mdp[i-1][j]+get(i,j,x)+1ll*x*k);//防止溢出dp[i][j][x]=min(dp[i][j][x],dp[i][j-1][x]+get(i,j,x));mdp[i][j]=min(mdp[i][j],dp[i][j][x]);}}}cout<<mdp[n][m]<<'\n';
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>T;while(T--){solve();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856375.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动端笔记应用,markdown应用选用

要求不能有广告。作为使用频率较高的软件,有广告就是恶心人。 支持markdown,包括且不限于代码块、标题、图片等格式。 支持同步,至少拥有WebDav云同步,或者本地导入导出。 全局搜索功能。以上功能必须免费,至少我不明白导入导出有什么好付费的。云同步这种付费理所当然。背…

一个.NET开源、易于使用的屏幕录制工具

前言 一款高效、易用的屏幕录制工具能够极大地提升我们的工作效率和用户体验,今天大姚给大家分享一个.NET开源、免费、易于使用的屏幕录制工具:Captura。 工具介绍 Captura是一款基于.NET开源、免费、易于使用的屏幕录制、截图工具,允许用户录制屏幕活动、捕获屏幕截图、录制…

CDN信息收集

引子:这篇是对架构信息收集中CDN部分的补充,由于Web应用先得注册域名才能使用CDN服务,而我国境内的域名注册需先要备案。又因为笔者目前并没有这方面的需求,因此本文仅简单介绍该如何识别CDN,以及一些常见的CDN绕过方式。免责声明:本文章仅用于交流学习,因文章内容而产生…

20结构伪类-borderz制图-网络字体-字体图标

一、结构伪类-:nth-child 在一些特殊的场景使用结构伪类还是非常方便的。 是真正有用的东西。 之前使用最主要的东西是nth-child() :nth-child(1)这个是选择父元素中的第一个子元素如果是下图这样就不能选中了。这里需要使用另外一个东西,叫做:nth-of-type()用这个东西可以选择…

【关节电机专栏】小米 CyberGear 电机和大然 PDA-04 CAN接口的区别

小米电机CAN接口:大然PDA-04 CAN接口:可见两家的CAN接口 CANL 和 CANH 是相反的。

BBU-Python期末考试复习题目总结

临近期末,抽个时间把BBU - python期末考试会考的题型(原题?)哈哈总结一下,放到我的个人bolg上供大家参考,祝考试高分通过————临近期末,抽个时间把BBU - python期末考试会考的题型(原题?)哈哈总结一下,python考试是比较简单的,题型分为选择题,判断题,填空题,程序…

老生常谈——分布式限流:部分Sentinal源码解读

基础知识HTTP CODE = 429 “请求过多”A. 限流的类型服务端客户端限流的标的IP用户...基本要求准确限制过量的请求。低延时。限流器不能拖慢HTTP响应时间。尽量占用较少的内存。这是一个分布式限流器,可以在多个服务器或者进程之间共享。需要处理异常。当用户的请求被拦截时,…

可扩展系统——基于SPI扩展

一、我们为什么讨论SPI? 为具有悠久历史的大型项目(屎山)添加新功能时,我们常常不太好评估变更的影响范围。因为原系统不具备良好的扩展性,导致修改整体发散,且不易单测。此时可以考虑使用接口来描述业务逻辑较为稳定的流程,并使用SPI机制来灵活的隔离加载实际的实现,来…

大模型--采样技术 TopK TopP 惩罚系数--37

目录1. 参考2. 概述重复惩罚(Repetition Penalty) 1. 参考 https://mp.weixin.qq.com/s/mBZA6PaMotJw7WeVdA359g 2. 概述 大型语言模型(LLMs)通过“根据上下文预测下一个 token 的概率分布”来生成文本。最简单的采样方法是贪心采样(Greedy Sampling),它在每一步选择概率…

关于分布式锁的的思考

关于分布式锁的的思考 结论先行: 对于分布式锁我们在考虑不同方案的时候需要先思考需要的效果是什么?为了效率(efficiency),协调各个客户端避免做重复的工作。即使锁偶尔失效了,只是可能把某些操作多做一遍而已,不会产生其它的不良后果。比如重复发送了一封同样的 email(…

2024-12-21:从魔法师身上吸取的最大能量。用go语言,在一个神秘的地牢里,有 n 名魔法师排成一列。每位魔法师都有一个能量属性,有的提供正能量,而有的则会消耗你的能量。 你被施加了一种诅咒,吸

2024-12-21:从魔法师身上吸取的最大能量。用go语言,在一个神秘的地牢里,有 n 名魔法师排成一列。每位魔法师都有一个能量属性,有的提供正能量,而有的则会消耗你的能量。 你被施加了一种诅咒,吸收来自第 i 位魔法师的能量后,你会立即被传送到第 (i + k) 位魔法师。在这个…