Wooden Signs Gym - 101128E (DP)
Problem E: Wooden Signs
\]
题意
给出一个\(n\),接下来\(n+1\)个数,前两个数表示最底下那层木板的左右边界,接下来\(n-1\)个数,每个数表示第\(i-1\)层那块木板的结束位置,开始位置要在上一层的边界上,并且这块木板必须和上一层的木板有重叠。问你一共有多少种摆放方法。
其实题中所说的箭头没有什么用
思路
令\(dp[i][j][k]\)表示第\(i\)层的木板边界\(j\)开始,结束位置往左或者往右的方案数。
容易想到,如果要在\(x\)放一个木板,如果我想要往左边放,那么只有一种情况可以放的下,就是上一层在我左边的块是往右边放的。同样的如果我想要往右边放,只有上一层的在我右边的块是往左边放的。
那么就可以得到\(dp\)方程。用\(0\)表示往左放,用\(1\)表示往右边放。
dp[i][j][0] += dp[i-1][k][1] \\
dp[i][k][1] += dp[i-1][k][1] \\
k > j\\
dp[i][j][1] += dp[i-1][k][0] \\
dp[i][k][0] += dp[i-1][k][0]
\]
最后的答案就是\(dp[n][a[n][0] + dp[n][a[n]][1]\),我不知道\(a[i]\)有多大,索性直接离散化做了。
/***************************************************************
> File Name : E.cpp
> Author : Jiaaaaaaaqi
> Created Time : 2019年05月06日 星期一 17时32分34秒
***************************************************************/
#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pii pair<int, int>
#define INOPEN freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout)
typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 2e3 + 10;
const int maxm = 1e5 + 10;
const ll mod = 2147483647;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std;
int n, m;
int cas, tol, T;
int a[maxn];
vector<int> vv;
ll dp[maxn][maxn][2];
int getid(int x) {
return lower_bound(vv.begin(), vv.end(), x) - vv.begin() + 1;
}
int main() {
mes(dp, 0);
scanf("%d", &n);
n++;
for(int i=1; i<=n; i++) {
scanf("%d", &a[i]);
vv.push_back(a[i]);
}
sort(vv.begin(), vv.end());
vv.erase(unique(vv.begin(), vv.end()), vv.end());
dp[2][getid(a[1])][1] = 1;
dp[2][getid(a[2])][0] = 1;
for(int i=3; i<=n; i++) {
int id = getid(a[i]);
for(int j=1; j<id; j++) {
if(dp[i-1][j][1] == 0) continue;
dp[i][j][1] += dp[i-1][j][1];
dp[i][id][0] += dp[i-1][j][1];
dp[i][j][1] %= mod;
dp[i][id][0] %= mod;
}
for(int j=id+1; j<=vv.size(); j++) {
if(dp[i-1][j][0] == 0) continue;
dp[i][j][0] += dp[i-1][j][0];
dp[i][id][1] += dp[i-1][j][0];
dp[i][j][0] %= mod;
dp[i][id][1] %= mod;
}
}
int tmp = getid(a[n]);
ll ans = dp[n][tmp][0] + dp[n][tmp][1];
printf("%lld\n", (ans%mod+mod)%mod);
return 0;
}
Wooden Signs Gym - 101128E (DP)的更多相关文章
- UVALive 7276 Wooden Signs (DP)
Wooden Signs 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/E Description http://7xjob4. ...
- Gym - 101128E Wooden Signs DP
题目大意: 一共n块木板,前两个数给出最底下木块的两个端点,后面n-1个数给出第i层的一个固定端点,问你木块的所有放置情况. 分析: 状态: d[i][j]表示第i个木块,第i-1块木板的未固定端点为 ...
- dp+分类讨论 Gym 101128E
题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/detail ...
- SEERC 2018 I - Inversion (Gym - 101964I) DP
Gym - 101964I 题意 有一个数组\(p\),如果满足\(i<j,p_i>p_j\),则\(i,j\)之间就有一条边相连,问存在多少个集合满足集合内的元素互不相连,且集合外的元素 ...
- C - Contest Setting Gym - 101982C dp 补题
题目链接:https://vjudge.net/contest/273260#problem/C 学习了一下别人的思路,首先去重,然后离散化. dp数组开二维,每一次更新,状态转移方程,dp[ i ] ...
- gym 102082B dp
和51nod1055 一样: #include<iostream> #include<cstdio> #include<algorithm> #include< ...
- Loppinha, the boy who likes sopinha Gym - 101875E (dp,记忆化搜索)
https://vjudge.net/contest/299302#problem/E 题意:给出一个01 0101串,然后能量计算是连续的1就按1, 2, 3的能量加起来.然后给出起始的能量,求最少 ...
- POJ - 1065 Wooden Sticks(贪心+dp+最长递减子序列+Dilworth定理)
题意:给定n个木棍的l和w,第一个木棍需要1min安装时间,若木棍(l’,w’)满足l' >= l, w' >= w,则不需要花费额外的安装时间,否则需要花费1min安装时间,求安装n个木 ...
- UVALive 7276 Wooden Signs
详细题目见:http://7xjob4.com1.z0.glb.clouddn.com/0f10204481da21e62f8c145939e5828e 思路:记dp[i][j]表示第i个木板尾部在j ...
随机推荐
- 单词uranolite陨石uranolite英语
陨石(uranolite)是指来自地球以外太阳系其他天体的碎片,绝大多数来自位于火星和木星之间的小行星,少数来自月球(40块)和火星(40块).全世界已收集到4万多块陨石样品,石陨石主要成分是硅酸盐. ...
- GoF的23种设计模式之行为型模式的特点和分类(2)
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配. 行为型模式分为类行为模式和对象行为模式,前者采用继 ...
- 概述UML——UML系列篇一
前言 作为Java应用开发者,日益感觉到对象建模的重要性.系统的复杂性,对于不能全局掌握的我和编程时没有对象模型指导时,编写实现代码时,感觉甚是困难.处于这些原因,这里想借助学习UML建模,在分析需求 ...
- 重温拉格朗日乘子法和KKT条件
在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...
- linux环境:FTP服务器搭建
转载及参考至:https://www.linuxprobe.com/chapter-11.html https://www.cnblogs.com/lxwphp/p/8916664.html 感谢原作 ...
- Django--模型层进阶
目录 QuerySet对象 可切片 可迭代 惰性查询 缓存机制 何时查询集不会被缓存? exists()与iterator()方法 exists() iterator() 中介模型 查询优化 表数据 ...
- Content-Type属性的取值和作用
1.Content-Type 的值类型: 1.1 application/json:消息主体是序列化后的 JSON 字符串 1.2 application/x-www-form-urlencoded: ...
- Java深入学习(5):锁
可重入锁: 简单来说,支持重复加锁,有可重用性 特征:锁可以传递,方法递归传递 目的:避免了死锁现象 代码: public class Test implements Runnable { @Over ...
- 为 Linux 应用程序编写 DLL
插件和 DLL 通常是用来无须编写整个新应用程序而添加功能的极好方法. 在 Linux 中,插件和 DLL 是以动态库形式实现的. 电子商务顾问兼设计师 Allen Wilson 介绍了动态库,并且向 ...
- 06-Vue路由
什么是路由 对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源: 对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有 ...