hdu2870(dp求最大子矩阵)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2870

分析:分别转换成‘a‘,‘b‘,‘c‘三种来求,其实就跟hdu1505一样了。。。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define inf 1<<30
using namespace std;
char s[1010][1010],str[1010][1010];
int sum[1005][1005],l[1010],r[1010];
int n,m;
int solve(char ch,char a,char b,char c)
{
    int t;
    memset(sum,0,sizeof(sum));
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            if(s[i][j]==a||s[i][j]==b||s[i][j]==c)str[i][j]=ch;
            else str[i][j]=s[i][j];
        }
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {

            if(str[i][j]==ch)sum[i][j]=sum[i-1][j]+1;
            else sum[i][j]=0;
        }
    int ans=-1;
    for(int i=1; i<=n; i++)
    {
        l[1]=1;
        r[m]=m;
        for(int j=2; j<=m; j++)
        {
            t=j;
            while(t>1&&sum[i][j]<=sum[i][t-1])t=l[t-1];
            l[j]=t;
        }
        for(int j=m-1; j>=1; j--)
        {
            t=j;
            while(t<m&&sum[i][j]<=sum[i][t+1])t=r[t+1];
            r[j]=t;
        }
        for(int j=1; j<=m; j++)
            ans=max(ans,(r[j]-l[j]+1)*sum[i][j]);
    }
    return ans;
}
int main()
{
    while(scanf("%d%d",&n,&m)>0)
    {
        for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
        int ans=-1;
        ans=max(ans,solve(‘a‘,‘w‘,‘y‘,‘z‘));
        ans=max(ans,solve(‘b‘,‘w‘,‘x‘,‘z‘));
        ans=max(ans,solve(‘c‘,‘x‘,‘y‘,‘z‘));
        printf("%d\n",ans);
    }
}

时间: 2024-12-23 23:22:24

hdu2870(dp求最大子矩阵)的相关文章

hdu1506(dp求最大子矩阵)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 分析: 对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1: 我们从左到右扫一遍,求出每个点的l保存在l[]数组里,然后从右到左扫一遍,求出每个点的r保存在r[]数组里,最后可以求出最大的矩阵了. #include <cstdio> #include <cstring> #include <

hdu1505(dp求最大子矩阵)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1505 分析: 这题是HDU 1506 的加强版,定义一个二维数组,d[i][j]表示第i行j列元素在前i行中的最大高度.(以第一行为底)例如测试样例: 0 1 1 1 1 1                                                 0 1 1 1 1 1 1 1 1 1 1 1           (F=1,R=0,方便求和)        1 2 2 2 2

hdu 1506 Largest Rectangle in a Histogram ((dp求最大子矩阵))

# include <stdio.h> # include <algorithm> # include <iostream> # include <math.h> using namespace std; __int64 a[100010],l[100010],r[100010];///l[i]左边连续大于等于a[i]的下标,r[i]右边连续大于等于a[i]的下标,所以对于a[i]的矩形面积为(l[i]-r[i]+1)*a[i]; int main() {

BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减

HDU 4405 Aeroplane chess (概率DP求期望)

题意:有一个n个点的飞行棋,问从0点掷骰子(1~6)走到n点需要步数的期望 其中有m个跳跃a,b表示走到a点可以直接跳到b点. dp[ i ]表示从i点走到n点的期望,在正常情况下i点可以到走到i+1,i+2,i+3,i+4,i+5,i+6 点且每个点的概率都为1/6 所以dp[i]=(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6])/6  + 1(步数加一). 而对于有跳跃的点直接为dp[a]=dp[b]; #include<stdio.h>

HDU4336-Card Collector(概率DP求期望)

Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2195    Accepted Submission(s): 1034 Special Judge Problem Description In your childhood, do you crazy for collecting the beautifu

HDOJ To The Max 1081【动态规划-详解求最大子矩阵】

To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9879    Accepted Submission(s): 4762 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectan

树形DP求树的重心 --SGU 134

令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心的属性值. 考虑用树形DP. dp[u]表示割去u点,得到的连通分支的节点数的最大值. tot[u]记录以u为根的这棵子树的节点数总和(包括根). 则用一次dfs即可预处理出这两个数组.再枚举每个点,每个点的属性值其实为max(dp[u],n-tot[u]),因为有可能最大的连通分支在u的父亲及以上

ZOJ3329-One Person Game(概率DP求数学期望)

One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very simple and interesting one-person game. You have 3 dice, namelyDie1, Die2 and Die3. Die1 hasK1 faces. Die2 has K2 faces.Die3 has K3 faces. All the dic