题目链接: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:

 // state expression:
// dp[i][j] = combinations
// i: considering ith board
//
// find the answer:
// ans = dp[n][4]
//
// transferring:
// dp[i][j] = sigma dp[i-k][j-1]
// k: 1 to min(half,i)
//
// boundary:
// dp[0][0] = 1
// others = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 2505 using namespace std; int n;
int dp[MAX_N][];
int sum[MAX_N][]; void read()
{
cin>>n;
} int cal_sum(int x,int y,int k)
{
if(x==) return sum[y][k];
return sum[y][k]-sum[x-][k];
} void update_sum(int x,int y)
{
if(x==) sum[x][y]=dp[x][y];
else sum[x][y]=sum[x-][y]+dp[x][y];
} void solve()
{
memset(dp,,sizeof(dp));
dp[][]=;
for(int i=;i<=n;i++)
{
sum[i][]=;
}
for(int j=;j<=;j++)
{
for(int i=;i<=n;i++)
{
dp[i][j]=cal_sum(max(,i-(n+)/+),i-,j-);
update_sum(i,j);
}
}
} void print()
{
cout<<dp[n][]<<endl;
} int main()
{
read();
solve();
print();
}

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. kettle转换之多线程

    kettle转换之多线程   ETL项目中性能方面的考虑一般是最重要的.特别是所讨论的任务频繁运行,或一些列的任务必须在固定的时间内运行.本文重点介绍利用kettle转换的多线程特性.以优化其性能. ...

  2. JavaScript 作用域链图具体解释

    <script type="text/javascript"> /** * 作用域链: */ var a = "a"; function hao94 ...

  3. Android NDK开发常见错误

    错误一: make: *** No rule to make target `/cygdrive/d/1-workspace/showmap-android-opengles/jni/showmap_ ...

  4. java nio读取和写入文件

    读取 package com.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputS ...

  5. PowerBuilder -- 保存图片

    String ls_path, ls_file_name, ls_filter, ls_errInt li_ret, li_loop, li_i, li_file, li_bytesLong ll_f ...

  6. WEB消息推送-comet4j

    一.comet简介: comet :基于 HTTP长连接的“服务器推”技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的 ...

  7. 为什么引入TSS

    [0]README text description from orange's implemention of a os and for complete code ,please visit ht ...

  8. 深入理解JVM:JVM执行时数据区域分类

    JVM在运行java程序的过程中会把他所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途和创建.销毁时间.有些区域随着虚拟机的启动而存在.有些区域则依赖用户线程的启动和结束而建立和销毁. ...

  9. C#中GroupBox控件的使用(转)

    GroupBox(框架)控件是C#中用来组织其他控件形成一个控件组,它的使用方法为[工具箱]->[所有Windows窗体](或者是[容器]列表中)->[GroupBox],拖拽到窗体界面中 ...

  10. git merge的本质

    1 git merge [branch] 将[branch]这个分支merge到当前分支. 2 merge的本质 merge就是把branch上的提交合入当前分支的提交树,这两个分支上的所有提交的历史 ...