hdu 4328 cut the cake#单调队列#DP

来源:互联网 发布:小非农数据几点公布 编辑:程序博客网 时间:2024/06/05 19:30
/**找最大的纯0 纯1 或01交叉的矩阵,01交叉的要是方阵前两种单调栈或单调队列第三种dpdp[i][j] = min(dp[i][j-1],dp[i-1][j]) + (mat[i][j] == mat[i-k][j-k])*/#include <stdio.h>#include <iostream>#include <string.h>using namespace std;#define N 1100char s[N][N];int mat[N][N];int lef[N],rig[N],dp[N][N];int m,n,hg[2][N];int f(int flag){    memset(hg,0,sizeof(hg));    int j;    int cur,pre,tmp,res = 0;    for(int i = 1; i <= n; ++i)    {        cur = (i & 1);        pre = !cur;        for(j = 1; j <= m; ++j)            if(mat[i][j] == flag)                hg[cur][j] = hg[pre][j] + 1;            else                hg[cur][j] = 0;                for(j = 1; j <= m; ++j)            lef[j] = rig[j] = j;        for(j = 2; j <= m; ++j)            while(lef[j] > 1 && hg[cur][j] <= hg[cur][lef[j]-1])                lef[j] = lef[lef[j]-1];        for(j = m - 1; j; --j)            while(rig[j] < m && hg[cur][j] <= hg[cur][rig[j]+1])                rig[j] = rig[rig[j]+1];        for(j = 1; j <= m; ++j)        {            if(hg[cur][j] == 0)///这让我想说卧槽~~~,疏忽鸟,作死WA                continue;            tmp = (rig[j] - lef[j] + 1 + hg[cur][j]) * 2;            if(tmp > res)                res = tmp;        }    }    return res ;}int dd(){    int i,j,ans = 1;    for(i = 1; i <= n; ++i)        dp[i][1] = 1;    for(j = 1; j <= m; ++j)        dp[1][j] = 1;    for(i = 2; i <= n; ++i)        for(j = 2; j <= m; ++j)        {            if(mat[i][j-1] != mat[i-1][j] || mat[i][j] == mat[i-1][j] || mat[i][j] == mat[i][j-1])                dp[i][j] = 1;            else            {                int k = dp[i][j] = min(dp[i-1][j],dp[i][j-1]);                if(mat[i][j] == mat[i-k][j-k])                    ++dp[i][j];            }            ans = max(ans,dp[i][j]);        }    return ans * 4;}int main(){    int t,j,i;    scanf("%d",&t);    int cas = 0;    char ss;    while(t--)    {        scanf("%d%d",&n,&m);        for(i = 1; i <= n; ++i)            for(j = 1; j <= m; ++j)            {                cin >> ss;                mat[i][j] = (ss == 'R');                s[i-1][j-1] = ss;            }        int ans = max(f(1),f(0));        ans = max(ans,dd());        printf("Case #%d: %d\n",++cas,ans);    }    return 0;}/*4 4RBRBBRBRRBRBBRBR4 4RRBRRBRBBRBRRBRB5 5BRRRRRRRBRBBRBRBRBRBBBRBR10 8BRBBBBBRRBRRRRRRBRBBBBBBRRRRRRRRRRRRRRRRRRBRBRBRBBRBRBRBRRBRBRBRBBRBRBRBRRBRBRBR11 8BRBBBBBRRBRRRRRRBRBBBBBBRRRRRRRRRRRRRRRRRRBRBRBRBBRBRBRBRRBRBRBRBBRBRBRBRRBRBRBRBBRBRBRB*/

原创粉丝点击