题目链接:点击打开链接
题解:预先处理好每个点向上延伸的最长长度,然后枚举每个点,向左去最小高度,然后加上就OK了;
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef long long ll;
const int mx = 2e2+10;
int r[mx][mx],n,m;
char str[mx][mx];
void get_rc(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(str[i][j]=='.'){
r[i][j]=r[i-1][j]+1;
}else{
r[i][j]=0;
}
}
}
}
int main(){
memset(r[1],0,sizeof(r[1]));
//freopen("1in","r",stdin);
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++) scanf("%s",str[i]+1);
get_rc();
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int minn = r[i][j];
ans+=minn;
for(int k=j-1;k>=1&&minn;k--){
minn=min(minn,r[i][k]);
ans+=minn;
}
}
}
printf("%d\n",ans);
}
return 0;
}