1. 程式人生 > >【DP】求三角形面積最大問題

【DP】求三角形面積最大問題

【題目描述】

       聖誕節快到了。你接受了一件光榮的任務,就是製作聖誕樹頂上的那顆大星星。不過當你拿到製作用的三角形銀紙的時候,你發現銀紙上面有許多洞。原來你的妹妹已經在銀紙上剪下了一些小的三角形來製作小星星。你唯有尋找一個演算法,告訴你在每張銀紙上還能切出來的最大的三角形面積.

  給定一個三角形,裡面有黑色和白色的區域,你必須找到白色的區域中最大三角形的面積,如圖下圖:


【輸入格式】

       輸入檔案只有第1行是一個整數n(1<=n<=100),表示該三角形的高。

  接下來n行每行包含由“#”和“-”組成的字串表示三角形的狀況。其中“#”代表黑色的區域,“-”代表白色的區域。

【輸出格式】

       輸出白色的區域中最大三角形的面積。

【樣例輸入】                                                【樣例輸出】

5                                                                                                 9
#-##----#
-----#-
---#-
-#-

-

簡單的DP,注意正三角形和倒三角形都可以,從上往下和從下往上兩遍DP即可。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<map>
using namespace std;
int n;
char ch[105][205];
int f[105][205],g[105][205],ans;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=2*(n-i)+1;j++)
		{
			char c;
			cin>>c;
			ch[i][j]=c;
		}
	}
	for(int i=1;i<=n;i++)
	for(int j=1;j<=2*(n-i)+1;j++)
	{
		if(ch[i][j]=='-')
		{
			f[i][j]=min(f[i-1][j],min(f[i-1][j+1],f[i-1][j+2]))+1;
			ans=max(ans,f[i][j]);
		}
	}
	for(int i=n;i>=1;i--)
	{
		for(int j=1;j<=2*(n-i)+1;j++)
		{
			if(ch[i][j]=='-')
			{
				g[i][j]=min(g[i+1][j-2],min(g[i+1][j-1],g[i+1][j]))+1;
				ans=max(ans,g[i][j]);
			}
		}
	}
	printf("%d",ans*ans);
}