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 ...
随机推荐
- qbittorrent搜索插件合集
qbittorrent搜索 qbittorrent搜索一个很有特色的功能: 这里收集整理了一些公开网站的插件(Plugins for Public sites),并连 源py文件一起分享. qbitt ...
- 核与线程 CPU 4核8线程 的解释
1.物理CPU: 物理CPU就是计算机上实际配置的CPU个数.在linux上可以打开cat /proc/cpuinfo 来查看,其中的physical id就是每个物理CPU的ID,能找到几个phys ...
- NModbus4 读取串口设备数值
使用NModbus4 读取串口 public static void aget() { byte[] array = new byte[8]; using (SerialPort port = new ...
- 3、Vue实例的属性
1.获取Vue实例的属性 2.data属性 每个Vue实例都会代理其data对象里所有的属性.如果实例创建之后添加或者更改属性,他不会触发视图更新. 这句话说了下面两件事情 1.每个Vue实例都会代理 ...
- NET MVC 上传文件
1.HTML @using (Html.BeginForm("UploadFile", "Student", FormMethod.Post, new { en ...
- asp.net core 系列之允许跨域访问-1(Enable Cross-Origin Requests:CORS)
接上篇的允许跨域 4.CORS 策略(Policy)的选项 这里讲解Policy可以设置的选项: 设置允许的访问源 设置允许的HTTP methods 设置允许的请求头(request header) ...
- Java Mockito 笔记
Mockito 1 Overview 2 Maven 项目初始化 3 示例 3.1 第一个示例 3.2 自动 Mock 3.3 Mock 返回值 3.4 Mock 参数 3.5 自动注入 Mock 对 ...
- PHP面试题2019年腾讯工程师面试题和答案
一.单选题(共29题,每题5分) 1.PHP执行的时候有如下执行过程:Scanning(Lexing) - Compilation - Execution - Parsing,其含义分别为: A.将P ...
- Django---图书管理系统,多对多(ManyToMany),request获取多个值getlist(),反查(被关联的对象.author_set.all)
Django---图书管理系统,多对多(ManyToMany),request获取多个值getlist(),反查(被关联的对象.author_set.all) 一丶多对多查询 表建立多对多关系的方式 ...
- Django:RestFramework之-------版本控制
6.版本控制 从URL通过get传参获取版本. 6.1自定义版本控制 from rest_framework.views import APIView class ParamVersion(objec ...