题目链接:http://codeforces.com/gym/101128

感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/details/61428924

Description 
n个小木条,一段前面有一个小箭头,给出第一个小木条的非箭头端端点横坐标以及每个小木条箭头端的坐标,现在要从下往上把这n’个木条按顺序叠放好,要求相邻两个小木条必须有一个共同端点且有交叠部分,问小木条有多少种放法 
Input 
第一行一整数n表示木条数量,之后输入n+1个整数分别表示第一个小木条非箭头端点和n个小木条的箭头端点横坐标(1<=n < 2000,每个端点横坐标是一个介于1~n+1之间的整数,保证第一个小箭头朝右)

思路:

定义dp(i,j)表示目前是第i个木头,他的区间是[min(j, a[i]), max(j, a[i])].

然后我们判断一下a[i-1]的范围和这个区间的范围,即分类讨论五种。

然后为了维护其中两种,所以我们这里还用了一个sum[j]数组表示dp[i][0]~dp[i][j]的和,然后这样就可以O(1)的到了

注意特判n=1的时候(因为这个wa了一发)

复杂度O(n^2)

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = + ;
const LL mod = ;
LL dp[maxn][maxn];
LL sum[maxn];
int a[maxn];
int n; int main(){
while(scanf("%d", &n) == ){
for (int i = ; i <= n; i++){
scanf("%d", a + i);
}
if (n == ) {
printf("1\n"); continue;
}
memset(dp, , sizeof(dp));
memset(sum, , sizeof(sum));
for (int i = ; i <= n + ; i++){
if (i == a[] || i == a[]) sum[i] = dp[][i] = ;
sum[i] = ;
}
int len = n + ;
for (int i = ; i <= n; i++){
for (int j = ; j <= len; j++){
if (j == a[i]) continue;
int lb = min(j, a[i]), rb = max(j, a[i]);
//printf("lb = %d rb = %d\n", lb, rb);
if (a[i - ] < lb){
dp[i][j] += dp[i - ][rb];
}
else if (a[i - ] == lb){
dp[i][j] += (sum[len] - sum[lb] + mod) % mod;
}
else if (a[i - ] > rb){
dp[i][j] += dp[i - ][lb];
}
else if (a[i - ] == rb){
dp[i][j] += sum[rb - ];
}
else {
dp[i][j] += dp[i - ][lb] + dp[i - ][rb];
}
if (dp[i][j] >= mod) dp[i][j] %= mod;
//printf("dp[%d][%d] = %lld\n", i, j, dp[i][j]);
}
for (int j = ; j <= len; j++){
sum[j] = (sum[j - ] + dp[i][j]) % mod;
}
}
LL ans = ;
for (int i = ; i <= len; i++){
ans = (ans + dp[n][i]) % mod;
}
cout << ans << endl;
}
return ;
}

dp+分类讨论 Gym 101128E的更多相关文章

  1. CH5104 I-country[线性DP+分类讨论]

    http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%B ...

  2. C. Functions again DP + 分类讨论

    http://codeforces.com/contest/789/problem/C 首先按题目要求处理出dis数组. 那么对于任意一个区间,[L, R],是dis[L] - dis[L + 1] ...

  3. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp

    题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x  问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...

  4. D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )

    D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...

  5. P5979 [PA2014]Druzyny dp 分治 线段树 分类讨论 启发式合并

    LINK:Druzyny 这题研究了一下午 终于搞懂了. \(n^2\)的dp很容易得到. 考虑优化.又有大于的限制又有小于的限制这个非常难处理. 不过可以得到在限制人数上界的情况下能转移到的最远端点 ...

  6. Codeforces 1461F - Mathematical Expression(分类讨论+找性质+dp)

    现场 1 小时 44 分钟过掉此题,祭之 大力分类讨论. 如果 \(|s|=1\),那么显然所有位置都只能填上这个字符,因为你只能这么填. scanf("%d",&n);m ...

  7. P2331 [SCOI2005]最大子矩阵 (动规:分类讨论状态)

    题目链接:传送门 题目: 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k( ...

  8. Codeforces 460D Little Victor and Set --分类讨论+构造

    题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...

  9. BZOJ-1067 降雨量 线段树+分类讨论

    这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...

随机推荐

  1. 软件工程-东北师大站-第五次作业(PSP)

    1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图

  2. dcom初步窥探一

    一.问题带入: 从delphi 5开始,有许多人都面临过这样的问题:com应用开发出来并且在本机上运行一切正常,但是一旦分发出去实施远程访问时,就无法正常运行了.我自己有段时间在看到“拒绝访问”错误提 ...

  3. myeclipse生成类的帮助文档

    http://blog.csdn.net/tabactivity/article/details/11807233

  4. 电梯V2.0

    电梯V2.0 GitHub仓库地址 Problem 一栋10层的大楼(楼层编号1-10),设3台无限载重的电梯,初始时电梯停在1层.其中:1号电梯只能停留在奇数层,2号电梯可以各层都停留,3号电梯只停 ...

  5. Java 成员初始化顺序

    package com.cwcec.test; class Fu { int num = 5; //构造代码块 { System.out.println("Fu constructor co ...

  6. 防御 XSS 的七条原则

    本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:<Stored and Reflected XSS ...

  7. request内置对象在JSP

  8. 简易四则运算生成程序——添加GUI支持

    项目成员:张金生     张政 工程地址: https://coding.net/u/jx8zjs/p/paperOne/git ssh://git@git.coding.net:jx8zjs/pap ...

  9. The goal you specified requires a project to execute but there is no POM in this directory

    [INFO] Scanning for projects... [INFO] ------------------------------------------------------------- ...

  10. 解决Lenovo(ldeapad)笔记本F1-F12功能键操作无效的问题

    1.操作条件:Lenovo笔记本自带的“一键恢复”按钮 2.操作方法:上下键为切换选项,回车键(Enter)为确定选择 (1)在笔记本电脑关机状态下,使用曲别针或其他物件按下笔记本自带的“一键恢复按钮 ...