ABC 210 D - National Railway
D - National Railway
矩阵DP,拆绝对值
设向下为 正方向,向右为 正方向
设两个点为 , 代价为
想办法拆掉绝对值
-
在 右下方,则
-
在 左下方,则
在第一种方案中,设 以 为右下角的小矩阵中, 的最小值
所以枚举 作为 , 的最小代价就是 (注意先更新 后求出当前的答案,再更新 , 因为 )
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
#define endl "\n"
typedef long long ll;
typedef pair<int, int> PII;
const int N = 1e3 + 10;
const ll INF = 0x3f3f3f3f3f3f3f3f;
int n, m;
ll c, a[N][N];
ll f[N][N];
ll solve1()
{
ll ans = INF;
memset(f, 0x3f, sizeof f);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
f[i][j] = min(f[i-1][j], f[i][j-1]);
ans = min(ans, a[i][j] + c * (i + j) + f[i][j]);
f[i][j] = min(f[i][j], a[i][j] - c * (i + j));
}
}
return ans;
}
ll solve2()
{
ll ans = INF;
memset(f, 0x3f, sizeof f);
for (int i = 1; i <= n; i++)
{
for (int j = m; j >= 1; j--)
{
f[i][j] = min(f[i-1][j], f[i][j+1]);
ans = min(ans, a[i][j] + c * (i - j) + f[i][j]);
f[i][j] = min(f[i][j], a[i][j] - c * (i - j));
}
}
return ans;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m >> c;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
ll ans = min(solve1(), solve2());
cout << ans << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!