HDU 1505
来源:互联网 发布:破壁机有用吗 知乎 编辑:程序博客网 时间:2024/06/05 02:19
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1010;int d[maxn][maxn];int l[maxn],r[maxn];int t,a,b;char c[2];int maxs;int main(){ scanf("%d",&t); while(t--) { scanf("%d%d",&a,&b); memset(d,0,sizeof(d)); maxs=0; for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { scanf("%s",c); if(c[0]=='F') d[i][j]=1; } } /* for(int i=0;i<a;i++) { for(int j=0;j<b;j++) printf("%d ",d[i][j]); printf("\n"); }*/ for(int i=1;i<a;i++) { for(int j=0;j<b;j++) { if(d[i][j]!=0) d[i][j]=d[i-1][j]+1; } } for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { l[j]=j; while(l[j]>0&&d[i][l[j]-1]>=d[i][j]) l[j]=l[l[j]-1]; } for(int j=b-1;j>-1;j--) { r[j]=j; while(r[j]<b-1&&d[i][r[j]+1]>=d[i][j]) r[j]=r[r[j]+1]; } for(int j=0;j<b;j++) { if(maxs<((r[j]-l[j]+1)*d[i][j])) maxs=(r[j]-l[j]+1)*d[i][j]; } } printf("%d\n",maxs*3); } return 0;}这个其实不是什么常见的DP问题了,这个是在求最大高度的左右边的时候也用了一个状态转移函数。
l[j]=l[l[j]-1];
r[j]=r[r[j]-1];
这个比较的难想到,其实这个题目的解题方法本身就是比较新颖的,一开始不一定可以想的到啊。
这个题目还需要注意的是要记得每次算完了一层i的l和r后要做一次求maxs。
然后在一开始读取数据的时候要记得小心,这种题目经常会在这里翻车,用scanf("%c",&c);加上各种getchar();这种读法的时候还是会WA的啊,这让人还是很郁闷的。
0 0
- HDU 1505
- HDU 1505
- hdu 1505
- HDU 1505
- hdu 1505
- hdu 1505
- hdu 1505
- hdu-1505
- HDU 1505
- HDU 1505
- HDU 1505
- HDU 1505
- HDU-1506 || HDU-1505 || HDU-2870 || HDU-2830
- hdu 1505 hdu 1506 hdu 2870 综合解答
- HDU 1505 City Game
- hdu 1505 City Game
- HDU 1505 dp
- hdu 1505 #DP
- 帧动画
- STL 简单 stack 的实现
- 自动设置Linux系统静态IP地址、DNS、网关、计算机名称脚本
- 动态规划——distinct-subsequences
- 指数平滑法
- HDU 1505
- 2016/5/21 1000.multiple inheritance
- jquery-animate动画
- CentOS下nginx启动脚本
- HDOJ/HDU 1250 Hat's Fibonacci(大数~斐波拉契)
- Java Environment Setup
- c++ 错误点集锦
- 【EF】DbFirst实现增删改查
- IO学习(十五)PrintStream打印流