codeforces——Palindromic Paths(思維)

題目鏈接

題意:給一個01矩陣,求從(1,1)到(n,m)每條路都能組成迴文串,最少修改幾次。

思路:我們可以發現從(1,1)走向(i,j)所走的步數是i+j-2,那麼我們記錄一下走相同步同時爲0或1的個數。我們找到對稱的步數,然後比較他們走相同步同時爲0或1的和取最小值。(意思爲吧一方變成0或者1)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define space putchar(' ')
#define enter putchar('\n')
typedef pair<int,int> PII;
const int mod=1e4+7;
const int N=2e6+10;
const int inf=0x7f7f7f7f;


ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}

ll lcm(ll a,ll b)
{
    return a*(b/gcd(a,b));
}

template <class T>
void read(T &x)
{
    char c;
    bool op = 0;
    while(c = getchar(), c < '0' || c > '9')
        if(c == '-')
            op = 1;
    x = c - '0';
    while(c = getchar(), c >= '0' && c <= '9')
        x = x * 10 + c - '0';
    if(op)
        x = -x;
}
template <class T>
void write(T x)
{
    if(x < 0)
        x = -x, putchar('-');
    if(x >= 10)
        write(x / 10);
    putchar('0' + x % 10);
}
int a[50][50];
int vis[150][150];

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
       memset(vis,0,sizeof vis);
       int n,m;
       cin>>n>>m;
       for(int i=1;i<=n;i++)
       {
           for(int j=1;j<=m;j++)
           {
               cin>>a[i][j];
               int step,v;
               step=i+j-2;
               v=a[i][j];
               vis[step][v]++;
           }
       }
       int ans=0;
       for(int i=0,j=n+m-2;j>i;j--,i++)
       {
           ans+=min(vis[i][1]+vis[j][1],vis[i][0]+vis[j][0]);
       }
       cout<<ans<<endl;
    }

    return 0;
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章