zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    class和struct
    类内初始值(c++11)
    默认初始化、值初始化
    聚合类
    对象
    排序算法的比较
    快速排序
    堆排序
    ubunu设置java命令为全局的命令-添加到全局环境变量
    Mina笔记
  • 原文地址:https://www.cnblogs.com/vincent-hwh/p/6137976.html
Copyright © 2011-2022 走看看