tyvj1192 迎春舞会之集体舞

背景

    HNSDFZ的同学们为了庆祝春节,准备排练一场舞会。

描述

    表演者排成n排,构成一个向前的正三角形(在屏幕上,即向下)。而就每个人,他有可能正面朝前(小的向前正三角形)、或向后三角形(小的向后正三角形)。
    然而这些人在服装上有明显区别——一部分穿冬季校服,其他的穿夏季校服。
    现在给出每个人的着衣情况,请你求穿夏季校服的同学所构成的最大正三角形,输出所含人数。
    

输入格式

    第一排为n。
    接下来n排,第i排有2*i-1个有效字符(‘#’或‘-’,分别表示此同学穿冬季校服或穿夏季校服)。输入文件中出现空格,且空格只是为了保持整个三角形的形状。

输出格式

    输出人数。

测试样例1

输入


#-##----# 
-----#- 
---#- 
-#- 
-

输出

9

备注

n<=100

注意三角形只能小头朝下
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 505;
int n,a[maxn][maxn],f[maxn][maxn],ans,sum[maxn];
int main(){
    cin>>n;
    char cmd;
    sum[1] = 1;
    for(int i = 1;i <= n;i++){
        for(int l = 1;l <= 2*(n-i) + 1;l++){
            int j = i + l - 1;
            scanf("%c",&cmd);
            while(cmd != '-' && cmd != '#') scanf("%c",&cmd);
            if(cmd == '#') a[i][j] = 1;
            else a[i][j] = 2;
        }
    }
    for(int i = 3;i <= 2 * n - 1;i += 2) sum[i] = sum[i-2] + i;
    for(int i = 1;i <= n;i++){
        for(int l = 1;l <= 2*(n-i) + 1;l++){
            int j = i + l - 1;
            if(a[i][j] == 2) f[i][j] = 1;
            if(l & 1) 
                if(a[i][j] == 2 && a[i][j+1] == 2 && a[i][j+2] == 2 && a[i+1][j+1] == 2) f[i][j] = 3;
            ans = max(ans,f[i][j]);
        }
    }
    for(int k = 5;k <= 2 * n - 1;k += 2){
        for(int i = 1;i <= n;i++){
            for(int l = 1;l <= 2*(n-i) + 1;l++){
                int j = i + l - 1;
                if((l & 1) && f[i][j] >= k - 2 && f[i][j+2] >= k - 2 && f[i+1][j+1] >= k - 2){
                    f[i][j] = k;
                    ans = max(ans,k);
                }
            }
        }
    }
    cout<<sum[ans];
    return 0;
} 

 

posted @ 2016-08-09 21:26  ACforever  阅读(364)  评论(0编辑  收藏  举报