[bzoj1600][Usaco2008 Oct]建造栅栏
题目大意
给一块长为n的木板,切成四块围成一个四边形,求有几种方案
分析
1.构成四边形的条件:三边之和大于第四边,故每条边不超过n/2;
2.总的方案数,可从最后一条边考虑起,最后一条边有多少种情况,再依次加上前面得出的结果
该问题具有无后效性,故可用动规解决
转移方程
f[i][j]表示划分到第i块,总长为j的方案数
f[i][j]=Σf[i-1][j-k]
其中,k表示第i块的长度,满足1<=k<=min(n/2,j)
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 int f[5][2510]; 10 11 scanf("%d",&n); 12 int max_length=(n+1)/2-1; 13 14 memset(f,0,sizeof(f)); 15 f[0][0]=1; 16 17 for (int i=1;i<=4;i++) 18 for (int j=0;j<=n;j++) 19 for (int k=1;k<=min(max_length,j);k++) 20 f[i][j]+=f[i-1][j-k]; 21 printf("%d",f[4][n]); 22 23 return 0; 24 }