[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 }
View Code

 

posted @ 2016-12-06 16:12  Vincent_hwh  阅读(117)  评论(0编辑  收藏  举报