luogu AC通道! (官方数据)

题目描述

小智家里来了很多的朋友,总共有N个人,站成一排,分别编号为0到N-1,小智要给他们分糖果。但 是有的朋友有一些特殊的要求,有的人要求他左右的两个人(左边一个、右边一个,一共2个人)的 糖果数都比他的多,有的人要求他左右的两个人的糖果数都比他的少。同时小智希望给不同的人分到 的糖果数不相同,并且每个人至少有一个糖果,同时小智希望分出的糖果个数尽可能的少,现在小智 想知道有多少种分糖果的方法。数据保证不会出现两个人的要求产生冲突的情况。

输入格式

第一行三个数N,M,K,分别表示人数,第一种要求的人的个数,K表示第二种要求的人的个数。 接下来M行,每行一个数x,表示位置x的人要求他左右两个人的糖果数都比他的多 接下来K行,每行一个数y,表示位置y的人要求他左右两个人的糖果数都比他的少

输出格式

输出一个数表示方法数对 1000000007取模的结果。

这道题考虑Dp解法。

如何想到用DP解法?  因为题目中要求我们最多有多少种方法,如果一个个枚举或者求出的话,就会让我们的时间复杂度分分钟上去。因此这类题都是套路一般的DP。

首先,看到题目中有两种要求。一种是让两边的小,一种是让两边的大。

这种要求有一点不好处理的就是,我们总是喜欢直接查看每一个点的情况,而不是查看其旁边的点情况,这样很不方便。于是我们转换一下。

设flagi = 1时,表示第 i 个点小于前一个点。同样的,当 flagi = 2时,表示第i个点大于前一个点。当然,falg = 0时,表示无特殊关系。

然后,设置一个dp[i][j] 表示由前 i 个数组成的序列且第 i 位为 j 的合法情况数。在规划的过程中,针对不同的 flag[i],对应不同的状态转移,这里涉及到一个最后一位数 j 插入序列的思维,可以看做把前边的每一种排列中大于等于 j 的数 ++,也就可以达到空出 j 这个数将其插入的效果。

在这里引入一个 sum[j],表示为前一轮状态下,最后一位小于等于 j 的情况的和。也就是说,当规划到第 i 位时,sum[j] 表示前 i - 1 位数组成的序列的合法情况的 dp[i - 1][j] 的前缀和。

到这里,这道题也就可以被我们AC了。我们要求的和就是 sum[n].

AC代码:

#include <bits/stdc++.h>
using namespace std;
#define N 100100
#define isdigit(c) ((c)>='0'&&(c)<='9')
const int mod = (int)1e9 + ; inline int read(){
int x = , s = ;
char c = getchar();
while(!isdigit(c)){
if(c == '-')s = -;
c = getchar();
}
while(isdigit(c)){
x = (x << ) + (x << ) + (c ^ '');
c = getchar();
}
return x * s;
} int flag[N], sum[N], dp[N];
int main(){
// freopen("candy.in","r",stdin);
// freopen("candy.out","w",stdout);
int n = read(), K = read(), M = read();
for(int i = ;i <= K; i++){
int a = read();
flag[++a] = ;
flag[a + ] = ;
}
for(int i = ;i <= M; i++){
int a = read();
flag[++a] = ;
flag[a + ] = ;
}
dp[] = sum[] = ;
for(int i = ;i <= n; i++){
for(int j = ;j <= i; j++){
if(flag[i] == ){
dp[j] = sum[i - ] % mod;
}
else if(flag[i] == ){
dp[j] = (sum[i - ] - sum[j - ] + mod) % mod;
}
else{
dp[j] = sum[j - ];
}
}
for(int j = ;j <= i; j++){
sum[j] = (sum[j - ] + dp[j]) % mod;
}
}
cout << sum[n] << endl;
return ;
}

小智的糖果(Candy) 51nod 提高组试题的更多相关文章

  1. 小智的旅行(Bridge)51nod 提高组试题

    luogu AC传送门(官方数据) 题目描述 小智最喜欢旅行了,这次,小智来到了一个岛屿众多的地方,有N座岛屿,编号为0到N-1,岛屿之间 由一些桥连接,可以从桥的任意一端到另一端,由于岛屿可能比较大 ...

  2. 战略威慑 51nod提高组试题

    AC通道 题目背景 马奥雷利亚诺布恩迪亚上校发动了他的第三十二次战争,让我们祝他好运. 题目描述 马孔多附近有n个城市, 有n-1条双向道路连通这些城市.上校想通过摧毁两条公路的方式对当局予以威慑.但 ...

  3. 小奇的糖果(candy)

    [题目背景]小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想.[问题描述]有 N 个彩色糖果在平面上. 小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果 ...

  4. 赛艇表演 51nod提高组模拟试题

    AC通道 题目描述 小明去某个地区观看赛艇比赛,这个地区共有n个城市和m条道路,每个城市都有赛艇比赛,在第i个 城市观看赛艇表演的价钱为ai, 去其他城市观看也需要支付赛艇表演的价格.任意两个城市之间 ...

  5. noip2010初赛提高组 试题详解

    转载自:https://blog.csdn.net/eirlys_north/article/details/52889970 一.单项选择题 1.与16进制数 A1.2等值的10进制数是 ( ) A ...

  6. noip2011初赛提高组 试题详解

    转载自:https://blog.csdn.net/Eirlys_North/article/details/52889993 一.单项选择题(共20题,每题1.5分,共计30分,每题有且仅有一个正确 ...

  7. 9.2 NOIP提高组试题精解(2)

    9-18 fruit.c #include <stdio.h> #define MAXN 10000 int Queue1[MAXN], Queue2[MAXN]; void Insert ...

  8. 9.2 NOIP提高组试题精解(1)

    9-16 poise.c #include <stdio.h> #define MAXN 1001 int main() { ], flag[MAXN] = { }; //保存6种砝码的数 ...

  9. NOIp 2018 普及&提高组试题答案

    你们考的咋样呢?在评论区说出自己的分数吧!

随机推荐

  1. matlab-均值滤波

    均值滤波 主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度.有效抑制加性噪声.缺点:容易引起图像模糊,可以对其进行改进,主要避开对景物边缘的平滑处理. 均值滤波器的缺点是存在着边缘模 ...

  2. 步入LTE、多址技术

    LTE系统的主要性能和目标 与3G相比,LTE主要性能特性: 带宽灵活配置:支持1.4MHz, 3MHz, 5MHz, 10Mhz, 15Mhz, 20MHz 峰值速率(20MHz带宽):下行100M ...

  3. 201771010113 李婷华 《面向对象程序设计(Java)》第十六周总结

    一.理论知识部分 1.程序是一段静态的代码,它应用程序执行蓝 是一段静态的代码,它应用程序执行蓝 是一段静态的代码,它应用程序执行蓝本. 2.进程是程序的一次动态执行,它对应了从代码加载.执行至执行完 ...

  4. Android下拉刷新SwipeRefreshLayout简单用法

    之前一直都想用下拉刷新,感觉上是庞大的工程,所以搁置了.现在学习了一下其实真的超级简单. 看了<第一行代码>以及 https://www.jianshu.com/p/3c402a9e4b7 ...

  5. 万盛酒店餐饮管理系统(SpringBoot,SSM,MySQL )

    项目源码获取地址: 链接:https://pan.baidu.com/s/1ip0keQruE2crA8vm1n8ZXQ 提取码:kivb 复制这段内容后打开百度网盘手机App,操作更方便哦 [功能包 ...

  6. 5G新基建到来,图扑推出智慧路灯三维可视化方案

    前言 作为智慧城市的重要组成部分,智慧灯杆管理系统采用信息化.数字化手段,把路灯及城市景观照明等各种不同对象的监控和数据采集及处理融于一体, 为城市管理者进行城市管理.进行科学决策提供了强有力的手段. ...

  7. Openwrt:mtd/mtd_write烧写固件

    文章目录 1 查看当前系统分区信息 2 备份固件firmware 3 恢复固件firmware 4 备份恢复Openwrt路由器配置 5 恢复Openwrt路由器默认设置 6 刷新路由器固件 比较简单 ...

  8. Cassandra数据建模

    1.  概述 Apache Cassandra将数据存储在表中,每个表都由行和列组成.CQL(Cassandra查询语言)用于查询存储在表中的数据.Apache Cassandra数据模型基于查询并针 ...

  9. 初探numpy

    安装numpy 通过python pip安装numpy pip install numpy numpy ndarray对象 创建ndarray对象只需调用numpy的array函数即可 numpy.a ...

  10. 透过面试题掌握HashMap【持续更新中】

    本文主要是自己阅读了HashMap和ConcurrentHashMap源码及一些Java容器类相关的博客后,找了一些很多面经中涉及到的Java容器相关的面试题,自己全部手写的解答,也花了一些流程图,之 ...