传送阵:CodeVS2186
思路:记$f_{i,j,k}$为第i到j个点连接恰好有k个等腰三角形的种数,区间dp,注意等腰三角形的几种情况。
代码比较清晰:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define mo 9397 int n,m,f[100][100][100]; int main(){ while (~scanf("%d%d",&n,&m)){ memset(f,0,sizeof f); for (int i=1;i<=n;i++) f[i][i+2][1]=f[i][i+1][0]=1; for (int i=3;i<=n-1;i++) for (int j=1;j<=n-i;j++) for (int k=1;k<=m;k++) for (int l=j+1;l<j+i;l++){ int tt=0,s1,s2,s3; s1=n-(j+i)+j; s2=l-j; s3=j+i-l; if (s1==s2 || s2==s3 || s3==s1) tt=1; for (int r=0;r<=k-tt;r++) f[j][j+i][k]=(f[j][j+i][k]+f[j][l][r]*f[l][j+i][k-r-tt])%mo; } printf("%d\n",f[1][n][m]); } return 0; }
|