HDU1505(HDU1506的加强版)

昨天打 CF又跪了。近期睡不好睡不好睡不好~感觉整个人都累傻了,根本无办法写下去,只写了一题签到题就跪了orz..从未试过这么悲剧。

今天早上凭着我的意念(“怨念”)。七点又起来了!

我已经连续好多天七点自己主动起来(不是自然醒。是意念,是意念....),刷啊刷啊刷dp.

今天刷的是昨天的加强版。实际上就多了一个for循环。和做高度处理,不直到是不是正解(  ╮(╯▽╰)╭ ),可是AC就好了...

经过多次调试我的shell脚本,这个acm.sh算是比較稳定了,还差一个自己主动提交机啊!

我的肉不够多啊,人肉提交非常累。

看到我的開始时间是07:41:44,由于我改了一下我的脚本,大概就是自己主动在hdu或者poj扒下測试数据。生成了文件in.txt,out.txt。以及自己主动生成带有ifndef什么的。

改.vimrc改到有小小感觉了。等我的机器人自己主动提交,我就能够共享到github,再写一篇关于我的acm.sh~不知道大家刷ACM的时候是不是特别蛋疼做非常多无谓的工作~(比方每次拍数据!

),我把我能想到能够机器人弄的都弄上去, O(∩_∩)O哈哈~

好吧。讲回题目。题目意思就是在一个方阵上找到最大的子矩阵,即所有标记为F的最大子矩阵。之后输出子矩阵F的个数*3.

思路就是,对每行构造高度矩阵(我是自顶向下的,比方 (R F F ;R F R)。这样做到的矩阵为(0,2,1;0,1,0),有了高度,对每行做昨天的1506,then output!

/***********************************************************
	> OS     : Linux 3.2.0-60-generic #91-Ubuntu
	> Author : yaolong
	> Mail   : dengyaolong@yeah.net 
	> Time   : 2014年06月02日 星期一 07:41:44
 **********************************************************/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int h[1005][1005];
char mp[1005][1005];
int lt[1005],rt[1005];
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif

    int T,n,m;
    scanf(" %d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++){
                scanf(" %c",&mp[i][j]);
            }
        }
        for(int j=1;j<=m;j++){
            h[0][j]=0;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(mp[i][j]=='R'){
                    h[i][j]=0;
                }else{
                    h[i][j]=h[i-1][j]+1;
                }
            }
        }
        /*
        for(int i=1;i<=n;i++){
          for(int j=1;j<=m;j++){
            printf("%d",h[i][j]);
          }
            puts("");
        }*/
        int mmax=0,t;
        for(int i=1;i<=n;i++){
            lt[1]=1;rt[m]=m;
            for(int j=2;j<=m;j++){
                t=j;
                while(t>1&&h[i][j]<=h[i][t-1]) t=lt[t-1];
                lt[j]=t;
            }
            for(int j=m-1;j>=1;j--){
                t=j;
                while(t<m&&h[i][j]<=h[i][t+1]) t=rt[t+1];
                rt[j]=t;
            }
            for(int j=1;j<=m;j++){
                mmax=max(mmax,h[i][j]*(rt[j]-lt[j]+1));
            }
        }
        printf("%d\n",mmax*3);
         
    }
    
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0;
}


转载于:https://www.cnblogs.com/zhchoutai/p/6758594.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值