一开始用的是暴力的方法,但是老是WA,后来看了看竟然是简单DP
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
char s[210][210];
int dp1[210][210],dp2[210][210];
int main(){
int n;
int cnt=0;
while(~scanf("%d",&n)&&n){
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
int maxx=0;
for(int i=0;i<n;i++){
scanf("%s",s[i]);
for(int j=0;j<(n-i)*2-1;j++){
if(s[i][j]=='-'){
dp1[i][j]=1;
maxx=1;
dp2[i][j]=1;
}
}
}
for(int i=n-1;i>=0;i--){
for(int j=1;j<(n-i)*2-1;j+=2){
if(dp1[i][j]*dp1[i][j+1]>0){
dp1[i][j+1]=min(dp1[i][j-1],dp1[i+1][j-1])+1;
maxx=max(maxx,dp1[i][j+1]);
}
}
}
for(int i=0;i<=n-1;i++){
for(int j=2;j<(n-i)*2-1;j+=2){
if(dp2[i][j]*dp2[i][j+1]>0){
dp2[i][j+1]=min(dp2[i][j-1],dp2[i-1][j+1])+1;
maxx=max(maxx,dp2[i][j+1]);
}
}
}
printf("Triangle #%d\n",++cnt);
printf("The largest triangle area is %d.\n",maxx*maxx);
printf("\n");
}
return 0;
}