HDU-4328-Cut the cake

来源:互联网 发布:mac如何截取网页全屏 编辑:程序博客网 时间:2024/05/18 04:00

昨天比赛没做出来这个题,今天看了某人的博客,转至去看了悬线,然后做了下。地址:http://blog.sina.com.cn/s/blog_8d5787ed010193oz.html

       其实把矩阵进行转换的时候还是比较巧妙的,比如0,1混合的时候就把加起来为奇数的块变换下值就行了

代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=1100;int n,m,ans,a[maxn][maxn],b[maxn][maxn],L[maxn][maxn],R[maxn][maxn],H[maxn][maxn];char str[maxn];void solve(){    for(int i=0;i<n;i++)    {        int sl=-1,sr=m;        for(int j=0;j<m;j++)        {            if(a[i][j])                sl=j;            L[i][j]=sl;        }        for(int j=m-1;j>=0;j--)        {            if(a[i][j])                sr=j;            R[i][j]=sr;        }    }    for(int j=0;j<m;j++)    {        H[0][j]=1;        if(R[0][j]-L[0][j]-1+H[0][j]>ans)            ans=R[0][j]-L[0][j]-1+H[0][j];    }    for(int i=1;i<n;i++)    {        for(int j=0;j<m;j++)        {            if(a[i-1][j])                H[i][j]=1;            else            {                H[i][j]=H[i-1][j]+1;                L[i][j]=max(L[i-1][j],L[i][j]);                R[i][j]=min(R[i-1][j],R[i][j]);            }            if(R[i][j]-L[i][j]-1+H[i][j]>ans)                ans=H[i][j]+R[i][j]-L[i][j]-1;        }    }}int main(){    int T,cas=1;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++)        {            scanf("%s",str);            for(int j=0;j<m;j++)            {                if(str[j]=='B')                    b[i][j]=1;                else                    b[i][j]=0;            }        }        ans=0;        //处理0矩阵        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)                a[i][j]=b[i][j];        solve();        //处理1矩阵        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)                a[i][j]=1-b[i][j];        solve();        //处理0,1混合        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            {                if((i+j)&1)                    a[i][j]=1-b[i][j];                else                    a[i][j]=b[i][j];            }        solve();        //处理0,1混合        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            {                if((i+j)&1)                    a[i][j]=b[i][j];                else                    a[i][j]=1-b[i][j];            }        solve();        printf("Case #%d: %d\n",cas++,ans*2);    }    return 0;}


0 0
原创粉丝点击