题目链接: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. mysql root密码忘记最快方法

    在my.cnf [mysqld]栏添加 skip-grant-tables 然后重启/etc/init.d/mysqld restart mysql ##select password('新密码') ...

  2. GUID概念

     GUID概念 GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是 ...

  3. 『HTML5梦幻之旅』 - 仿Qt演示样例Drag and Drop Robot(换装机器人)

    起源 在Qt的演示样例中看到了一个有趣的demo.截图例如以下: 这个demo的名字叫Drag and Drop Robot,简单概括而言,在这个demo中,能够把机器人四周的颜色拖动到机器人的各个部 ...

  4. poj1649 Rescue(BFS+优先队列)

    Rescue Time Limit: 2 Seconds      Memory Limit: 65536 KB Angel was caught by the MOLIGPY! He was put ...

  5. template.js文档

    参见GitHub:https://github.com/yanhaijing/template.js/ template.js简介: template.js 一款javascript模板引擎,简单,好 ...

  6. 效率提升最重要的原则 - Doing one thing at a time

    前段时间流行的时间管理方法 - url=NotLrz-4f4eCgENFAECrXNw88mSLoJ2Rc2MrkP4aes1yQvPjNQRlmdYcbz9oP9U8JoBzJeY-DSUhhInx ...

  7. HDU1845Jimmy’s Assignment(无向图,最大匹配)

    题意:就是求最大匹配 #include<cstdio> #include<iostream> #include<algorithm> #include<cma ...

  8. 邮箱大师WPZ协议包

    WIRELESS Z PACKET: i8-version(WZPUnit.getVersion() & 3 | WZPUnit.MAGIC_MASK = 1 & 3 | -48 = ...

  9. Jquery EasyUI弹出窗体

    $("#btnCreate").click(function () { $("#modalwindow").html("<iframe widt ...

  10. 利用GROUP_CONCAT函数把相同信息的合并到同一个字段中

    SELECT a.*,GROUP_CONCAT(b.pri_name) FROM sh_role a LEFT JOIN sh_privilege b ON FIND_IN_SET(b.id,a.pr ...