【DP】求三角形面積最大問題
阿新 • • 發佈:2019-01-29
【題目描述】
聖誕節快到了。你接受了一件光榮的任務,就是製作聖誕樹頂上的那顆大星星。不過當你拿到製作用的三角形銀紙的時候,你發現銀紙上面有許多洞。原來你的妹妹已經在銀紙上剪下了一些小的三角形來製作小星星。你唯有尋找一個演算法,告訴你在每張銀紙上還能切出來的最大的三角形面積.給定一個三角形,裡面有黑色和白色的區域,你必須找到白色的區域中最大三角形的面積,如圖下圖:
【輸入格式】
輸入檔案只有第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); }