传送门
Solution
a
n
s
=
m
i
n
(
A
x
1
,
y
1
+
A
x
2
,
y
2
+
(
∣
x
1
?
x
2
∣
+
∣
y
1
?
y
2
∣
)
×
C
)
ans = min(A_{x_1, y_1} + A_{x_2,y_2} + (|x_1 - x_2| + |y_1- y_2|) \times C)
ans=min(Ax1?,y1??+Ax2?,y2??+(∣x1??x2?∣+∣y1??y2?∣)×C)
-
假
设
(
x
1
,
y
1
)
位
于
左
上
角
,
(
x
2
,
y
2
)
位
于
右
下
角
假设(x_1, y_1)位于左上角,(x_2,y_2)位于右下角
假设(x1?,y1?)位于左上角,(x2?,y2?)位于右下角
a
n
s
=
m
i
n
(
A
x
1
,
y
1
?
(
x
1
+
y
1
)
×
C
+
A
x
2
,
y
2
+
(
x
2
+
y
2
)
×
C
)
ans = min(A_{x_1, y_1} - (x_1 + y_1) \times C + A_{x_2,y_2} + (x_2 + y_2) \times C)
ans=min(Ax1?,y1???(x1?+y1?)×C+Ax2?,y2??+(x2?+y2?)×C)
则
可
以
利
用
二
维
前
缀
和
的
思
想
,
求
出
m
i
n
(
A
x
1
,
y
1
?
(
x
1
+
y
1
)
×
C
)
,
1
≤
x
1
≤
x
2
,
1
≤
y
1
≤
y
2
则可以利用二维前缀和的思想,求出\\min(A_{x_1, y_1} - (x_1 + y_1) \times C), 1 \leq x_1 \leq x_2, 1 \leq y_1 \leq y_2
则可以利用二维前缀和的思想,求出min(Ax1?,y1???(x1?+y1?)×C),1≤x1?≤x2?,1≤y1?≤y2? -
则
可
以
O
(
1
)
求
出
以
(
1
,
1
)
为
左
上
角
,
(
x
2
,
y
2
)
为
右
下
角
顶
点
的
矩
阵
中
的
最
小
的
a
n
s
了
然
后
枚
举
所
有
的
点
取
最
小
值
即
可
则可以O(1)求出以(1,1)为左上角,(x_2,y_2) 为右下角顶点的矩阵中的最小的ans了\\然后枚举所有的点取最小值即可
则可以O(1)求出以(1,1)为左上角,(x2?,y2?)为右下角顶点的矩阵中的最小的ans了然后枚举所有的点取最小值即可 -
(
x
1
,
y
1
)
位
于
左
下
角
,
(
x
2
,
y
2
)
位
于
右
上
角
,
分
析
方
法
类
似
(x_1, y_1)位于左下角,(x_2,y_2)位于右上角,分析方法类似
(x1?,y1?)位于左下角,(x2?,y2?)位于右上角,分析方法类似
Code
const int N = 1e3 + 3;
ll a[N][N];
ll f[N][N];
int main()
{
IOS;
ll n, m, c; cin >> n >> m >> c;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
ll ans = 1e18;
mt(f, 0x3f);
for (int i = n; i >= 1; i--)
for (int j = 1; j <= m; j++)
f[i][j] = min(f[i + 1][j], f[i][j - 1]),
f[i][j] = min(f[i][j],a[i][j] + (i - j) * c);
for (int i = n; i >= 1; i--)
for (int j = 1; j <= m; j++)
ans = min(ans, min(f[i + 1][j], f[i][j - 1]) + a[i][j] + (j - i) * c);
mt(f, 0x3f);
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]),
f[i][j] = min(f[i][j], a[i][j] - (i + j) * c);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
ans = min(ans, min(f[i - 1][j], f[i][j - 1]) + a[i][j] + (i + j) * c);
cout << ans << endl;
return 0;
}
|