题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1600

题意:

  给你一个长度为n的木板,让你把这个木板切割成四段(长度为整数),并且要求这四段可以构成一个四边形。

  问你有多少种切割方法(切割点不同就算不同)。

题解:

  构成四边形的条件:

    任意一边长度 < 周长/2

    证明:设四边为a,b,c,d。因为有a < b+c+d,所以2*a < a+b+c+d = C,所以a < C/2。

  简化问题:

    给你n个小木块,排成一排。问你将这些小木块分成四部分,且能构成四边形的方案数。

  表示状态:

    dp[i][j] = combinations

    i:已经选了前i个木块

    j:已经分成了j部分

  找出答案:

    ans = dp[n][4]

    第n块已经选了,共被分成了4部分。

  如何转移:

    dp[i][j] = ∑ dp[i-k][j-1] (k <= i, k < (n+1)/2)

    同时保证下标 >= 0,以及边长k < 周长/2。

  边界条件:

    dp[0][0] = 1

    others = 0

    什么都没选为一种方案。

  优化:

    前缀和。

    (其实不优化也能过。。。)

AC Code:

  1. // state expression:
  2. // dp[i][j] = combinations
  3. // i: considering ith board
  4. //
  5. // find the answer:
  6. // ans = dp[n][4]
  7. //
  8. // transferring:
  9. // dp[i][j] = sigma dp[i-k][j-1]
  10. // k: 1 to min(half,i)
  11. //
  12. // boundary:
  13. // dp[0][0] = 1
  14. // others = 0
  15. #include <iostream>
  16. #include <stdio.h>
  17. #include <string.h>
  18. #define MAX_N 2505
  19.  
  20. using namespace std;
  21.  
  22. int n;
  23. int dp[MAX_N][];
  24. int sum[MAX_N][];
  25.  
  26. void read()
  27. {
  28. cin>>n;
  29. }
  30.  
  31. int cal_sum(int x,int y,int k)
  32. {
  33. if(x==) return sum[y][k];
  34. return sum[y][k]-sum[x-][k];
  35. }
  36.  
  37. void update_sum(int x,int y)
  38. {
  39. if(x==) sum[x][y]=dp[x][y];
  40. else sum[x][y]=sum[x-][y]+dp[x][y];
  41. }
  42.  
  43. void solve()
  44. {
  45. memset(dp,,sizeof(dp));
  46. dp[][]=;
  47. for(int i=;i<=n;i++)
  48. {
  49. sum[i][]=;
  50. }
  51. for(int j=;j<=;j++)
  52. {
  53. for(int i=;i<=n;i++)
  54. {
  55. dp[i][j]=cal_sum(max(,i-(n+)/+),i-,j-);
  56. update_sum(i,j);
  57. }
  58. }
  59. }
  60.  
  61. void print()
  62. {
  63. cout<<dp[n][]<<endl;
  64. }
  65.  
  66. int main()
  67. {
  68. read();
  69. solve();
  70. print();
  71. }

BZOJ 1600 [Usaco2008 Oct]建造栅栏:dp【前缀和优化】的更多相关文章

  1. BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )

    QAQ我没读过书...四边形都不会判定了 简单的dp.... --------------------------------------------------------------------- ...

  2. BZOJ 1600: [Usaco2008 Oct]建造栅栏

    1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec  Memory Limit: 64 MB Description 勤奋的Farmer John想要建造一个四面的 ...

  3. bzoj 1600: [Usaco2008 Oct]建造栅栏【dp】

    要求三边和大于第四边,所以任意一条边的长度都是小于n/2 设f[i][j]为前i条长为j,转移的时候用n/2限制 #include<iostream> #include<cstdio ...

  4. 【BZOJ】1600: [Usaco2008 Oct]建造栅栏(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1600 说好的今天开始刷水.. 本题一开始我以为是排列组合,但是自己弱想不出来,只想到了如果四边有一条 ...

  5. BZOJ1600: [Usaco2008 Oct]建造栅栏

    1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 825  Solved: 473[Submit][Sta ...

  6. bzoj1600 [Usaco2008 Oct]建造栅栏(递推)

    Description 勤奋的Farmer John想要建造一个四面的栅栏来关住牛们.他有一块长为n(4<=n<=2500)的木板,他想把这块本板 切成4块.这四块小木板可以是任何一个长度 ...

  7. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  8. [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)

    [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列) 题面 两个人玩游戏,共进行t轮,每人每轮从[-k,k]中选出一个数字,将其加到自己的总分中.已 ...

  9. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

随机推荐

  1. vue v-for与v-if组合使用

    当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中.当你想为仅有的_一些_项渲染节点时,这种优先级的机制会十分有用,如下: < ...

  2. Java Transaction Management

    Just a few weeks ago, I had a discussion with one of my colleagues about how to manage the transacti ...

  3. android历史

    Android一词最早是出如今法国作家维里耶德利尔·亚当1986年发表的<未来夏娃>这部科幻小说中,作者利尔·亚当将外表像人类的机器起名为Android.这就是Android小人名字的由来 ...

  4. 在C#中怎样推断线程当前所处的状态

    在C#中怎样推断线程当前所处的状态 老帅       在C#中.线程对象Thread使用ThreadState属性指示线程状态.它是带Flags特性的枚举类型对象.    ThreadState 为线 ...

  5. php设计模式中的类型安全 指--只接受特定的对象 ---以避免发生错误

    在百度百科中---类型安全代码指访问被授权可以访问的内存位置

  6. 有关SQL注入的知识

    SQL注入攻击是非常令人讨厌的安全漏洞,是所有的web开发人员,不管是什么平台,技术,还是数据层,需要确信他们理解和防止的东西.不幸的是,开发人员往往不集中花点时间在这上面,以至他们的应用,更糟糕的是 ...

  7. 把对象写入Postgresql中

    工作中,遇到把大对象写入Postgresql数据库中 package com.geni_sage.gdme.cws.dic; import java.io.BufferedInputStream; i ...

  8. 输入一个n,输出2到n的详细素数值

    #include<stdio.h> #include<algorithm> #include<cmath> int judge(int a) { int j; fo ...

  9. Rider

    听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider   本文地址:http://www.cnblogs.com/likeli/p/8461010.html 前言 .NET平台的开发一直都只 ...

  10. 【BZOJ3544】[ONTAK2010]Creative Accounting 前缀和+set

    [BZOJ3544][ONTAK2010]Creative Accounting Description 给定一个长度为N的数组a和M,求一个区间[l,r],使得(\sum_{i=l}^{r}{a_i ...