tyvj1192 迎春舞会之集体舞
背景
HNSDFZ的同学们为了庆祝春节,准备排练一场舞会。
描述
表演者排成n排,构成一个向前的正三角形(在屏幕上,即向下)。而就每个人,他有可能正面朝前(小的向前正三角形)、或向后三角形(小的向后正三角形)。
然而这些人在服装上有明显区别——一部分穿冬季校服,其他的穿夏季校服。
现在给出每个人的着衣情况,请你求穿夏季校服的同学所构成的最大正三角形,输出所含人数。
输入格式
第一排为n。
接下来n排,第i排有2*i-1个有效字符(‘#’或‘-’,分别表示此同学穿冬季校服或穿夏季校服)。输入文件中出现空格,且空格只是为了保持整个三角形的形状。
输出格式
输出人数。
测试样例1
输入
5
#-##----#
-----#-
---#-
-#-
-
输出
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; }