codevs2215 三角形蛋糕

codevs2215 三角形蛋糕


原题链接


煞笔题???
开始一看似乎没啥思路的样子
然后想了一下
额。。。
首先啃腚考虑缩进存储
然后看一下这样的性质

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

|
V

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

and

-----
 ---
  -

|
V

-----
---
-

那么三角形就变成这个鬼样子了嘛。
那么设f[i][j]表示(i,j)为三角形最下面的那个点向上能扩展的最多行数
s[i][j]='#'->f[i][j]=0
s[i][j]='-'->f[i][j]=min(f[i-1][j],f[i-1][j-1],f[i-1][j-2])+1
答案为(max){(f[i][j]^2)}.
然后你会发现WA了
答案小了
原因是三角形可能有倒的
重新YY出另一个状态:
那么设f[i][j]表示(i,j)为三角形最上面的那个点向下能扩展的最多行数
转移差不多,可以看代码
然后你会发现再次WA
答案大了(QwQ)
原因是。。。
一个点可能无法更新答案但还是更新了!!!
比如这个点对应的三角形是倒的 然而更新了正的状态,特判一下


Code

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define Fname "trigon"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
    rg int x=0;rg char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
char c[101][202];
int f[101][202],g[101][202];
int main(){
    #ifdef xzz
    freopen(Fname".in","r",stdin);
    freopen(Fname".out","w",stdout);
    #endif
    int n=gi();
    rep(i,1,n)scanf("%s",c[i]+1);
    int ans=0;
    rep(i,1,n*2-1)if(c[1][i]!='#')f[1][i]=ans=1;
    rep(i,2,n)drep(j,(n-i)*2+1,1){
	if(c[i][j]!='#')f[i][j]=min(f[i-1][j],min(f[i-1][j+1],f[i-1][j+2]))+1;
	if(j&1)ans=max(ans,f[i][j]);
    }
    if(c[n][1]=='#')g[n][1]=1;
    drep(i,n-1,1)drep(j,(n-i)*2+1,1){
	if(j<3||j>(n-i-1)*2+1)g[i][j]=c[i][j]=='-';
	else if(c[i][j]!='#')g[i][j]=min(g[i+1][j],min(g[i+1][j-1],g[i+1][j-2]))+1;
	if(!(j&1))ans=max(ans,g[i][j]);
    }
    printf("%d
",ans*ans);
    return 0;
}
原文地址:https://www.cnblogs.com/xzz_233/p/7545827.html