CF1366C Palindromic Paths

CF1366C Palindromic Paths

Lionlnuc
Lionlnuc Lv4

题目链接: Problem - 1366C - Codeforces
题意:
给你一个 的矩阵,里面每一位只有0和1,起点从 到 只能向下或向右走,
思路:
从 到 不管怎么走都要走 步,所以每条回文路径的长度为 。
走到 a[i][j] 时一定走了 i+j-2 步,如果这是一条回文路径,那么第 K 步经过的格子值=第 (L-K) 步经过的格子值。
但路径不唯一,不同路径在同一步可能选择不同格子。
所以为了能够使所有路径都回文,我们要让所有第 K 步的格子都等于第 (L-K) 步的格子。
每一步的可达格子集合是固定的。
这样对于每一步就有两种选择,都改为 1 或者都改为 0,我们要选择修改次数最少的。所以可以统计每一步的 0/1 的数量。
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N=35;
int cnt[100][2];//这里需要注意的是cnt[step][0]表示step步可达的格子中0的数量,step=n+m-2,数组开够大
void solve()
{
int n,m;
cin>>n>>m;
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int t;
cin>>t;
int step=i+j-2;
cnt[step][t]++;
}
}
int l=n+m-2;
int ans=0;
for(int i=0,j=l;j>i;j--,i++)
{
ans+=min(cnt[i][0]+cnt[j][0],cnt[i][1]+cnt[j][1]);
}
cout<<ans<<endl;
}
signed main(){
IOS
int t;
cin>>t;
//int t=1;
while(t--)
{
solve();
}
}
  • 标题: CF1366C Palindromic Paths
  • 作者: Lionlnuc
  • 创建于 : 2026-02-02 00:00:00
  • 更新于 : 2026-02-02 00:00:00
  • 链接: https://lionlnuc.github.io/2026/02/02/CF1366C Palindromic Paths/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
CF1366C Palindromic Paths