zoj1245

一开始用的是暴力的方法,但是老是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;
}

你可能感兴趣的:(zoj1245)