【每日一题】4月27日题目精讲 Removal
链接:
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
Bobo has a sequence of integers s1, s2, …, sn where 1 ≤ si ≤ k. Find
out the number of distinct sequences modulo (109+7) after removing
exactly m elements.
输入描述:
The input consists of several test cases and is terminated by
end-of-file. The first line of each test case contains three integers
n, m and k. The second line contains n integers s1, s2, …, sn.
输出描述:
For each test case, print an integer which denotes the result.
示例1
输入
3 2 2
1 2 1
4 2 2
1 2 1 2
输出
2
4
题意:
长度为n的一组数,每个数都大于等于1,小于等于k,现在删除里面m个数,问会出现多少种情况?
题解:
dp问题
dp[i][j]表示前i个数字删去j个数字之后有多少个不同的序列数
列出转移方程:f [ i ] [ j ] = f [ i - 1 ] [ j ] + f [ i - 1 ] [j - 1]
转移方程很经典,就是我们考虑当前这个数删不删,如果不删,那就是前i-1个数删去j个数,如果删去,那就是前i-1个数删去j-1个数
但是!但是!
这个题会出现重复情况
比如:513241
删去四个数,有可能是51也可能是51(*为被删去的数)
,这不就重复了
怎么去除重复?
发生重复说明当前这个第i位的w选上了,我们需要找上一个出现的w,如果以w结尾并且子串的长度和删后长度(i-j)相等的就是和dp[ i ] [ j ] 重复的,直接减去即可.
为什么呢?继续看我给的样例:… 5 1 3 2 4 1
先不管5之前的省略号,假设5是第一位
我们知道第二位和第六位都是1,两个i之间的距离是len=5(含两端),如果我们将两个1之间的数全部删去,就是5 1 * * * 1,再删除任何一个1,剩下的数就是重复的,你删去前面的1,剩下5 * * * * 1,删除后面剩下5 1 * * * * 。所以重复的部分就是第一个1前面的数与1所组成的序列 。
加上省略号,5之前还有很多数,查重的话就是把省略号中(算上5)的方法数去掉
我们要用到:last[i]表示第i位的数w的上一次出现位置
能得到:
dp [ i ] [ j ] = d p [ i ] [ j ]− dp [ pre [ i ] − 1 ] [ j− ( i − pre [ i ] ) ]
dp [ pre [ i ] − 1 ] [ j− ( i − pre [ i ] ) ] :就是重复情况
pre[i] - 1就是重复的数字上一次出现的位置的前一位
(i - pre [ i ] )就是len-1,就是两个数之间的数全删去再加上删任意一个端点。
j-(len-1)就是把这些数删去后,还要删的数量,而要删的就是pre[i]-1之前的数
我可能讲的不是很明白,看代码吧
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 2;
const int mod= 1e9+7;
int dp[maxn][12];
int a[maxn];
int pos[12], last[maxn];
void init()
{for (int i = 0; i <= n; i++)dp[i][0] = dp[i][i] = 1;
}
int main()
{int n, m, k,w;while (~scanf("%d%d%d",&n,&m,&k)){init();//初始化,不删去和全删去的都只有一种 memset(pos, 0, sizeof(pos));for (int i = 1; i <= n; i++) {scanf("%d",&a[i]);last[i] = pos[a[i]];pos[a[i]] = i;}for (int i = 1; i <= n; i++) {w = min(i - 1, m);for (int j = 1; j <= w; j++){dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j]) % mod;//不查重的情况 if (last[i] && i - last[i] <= j)//如果前面有重复的数字,并且所要删除的数字的数量要能够删去重复数字之间的数(加上一端重复的数)dp[i][j] = (dp[i][j] - dp[last[i] - 1][j - (i - last[i])] + mod) % mod;//将重复部分去掉}}cout << dp[n][m] << endl;}return 0;
}
【每日一题】4月27日题目精讲 Removal相关推荐
- 牛客网 每日一题 7月23日题目精讲—wpy的请求
来源:牛客网: 文章目录 wpy的请求 题解: 代码: wpy的请求 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge ...
- 牛客网【每日一题】5月27日题目精讲 货币系统
链接: 文章目录 题目描述 题解: 代码: 题目描述 在网友的国度中共有n种不同面额的货币,第i种货币的面额为a[i],你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为n.面额数组为a[1 ...
- 【每日一题】8月27日题目精讲 Is It A Tree?
链接:https://ac.nowcoder.com/acm/problem/105905 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 10000K,其他语言2000 ...
- 牛客网 【每日一题】7月27日题目精讲—乌龟棋
来源:牛客网: 乌龟棋 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 文章目录 乌龟棋 题目描述 ...
- 【每日一题】8月28日题目精讲 编号
[每日一题]8月28日题目精讲 编号 链接:https://ac.nowcoder.com/acm/problem/19925 来源:牛客网 题目描述 你需要给一批商品编号,其中每个编号都是一个7位1 ...
- 【每日一题】7月17日题目精讲—BOWL 碗的叠放
[每日一题]7月17日题目精讲-BOWL 碗的叠放 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld ...
- 【每日一题】7月15日题目精讲—生日快乐
[每日一题]7月15日题目精讲-生日快乐 [SCOI2009]生日快乐 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO For ...
- 【每日一题】7月13日题目精讲—Kingdom
[每日一题]7月13日题目精讲-Kingdom 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 1048576K,其他语言2097152K 64bi ...
- 【牛客每日一题】tokitsukaze and Soldier 题目精讲 贪心、优先队列、堆
链接:https://ac.nowcoder.com/acm/problem/50439 来源:牛客网 ACM在线模板 今天才发现牛客推出了一个每日一题的版块,3月25号就开始了,今天才发现,赶紧补救 ...
最新文章
- 乐高机器人教室布置图片大全_全国青少年机器人技术等级考试(上海宝山站)顺利举行...
- UVa11292 - Dragon of Loowater(贪心)
- sql join on 多表连接_阿里规范不建议多表Join,可这SQL要怎么写啊?
- maven 添加本地库
- 太原工业学院单片机课程设计_单片机智能小车毕业设计论文
- RCurl网络数据抓取
- lenovo X230热键功能
- 在AVEVA PDMSE3D软件实现三维二维码模型
- 用Java实现JVM第五章《指令集和解释器》
- Apache运行模式MPM详解
- anaconda离线安装pytorch
- Java项目名前有红色感叹号怎么解决
- 微信V3接口商家转账到零钱
- 小米笔记本降价销售或预示其销售未如理想
- MySQL insert 插入优化技巧,MySQL 优化学习第8天
- 《Hyperledger Fabric官方文档》区块链的网络
- 【第一届“文翁杯”现场竞技赛】T2 —蜀石经(优先队列模拟)
- 魔兽世界你无法向该服务器发邮件什么意思,魔兽世界:对于怀旧服无法上线的3大原因!暴雪是这样解释的!...
- Npoi html导入到excel,.net mvc 利用NPOI导入导出excel
- Edge打不开中国知网的一次经历
热门文章
- 推荐7个高质量的学术公众号
- 震惊整个世界的新发现,科学界的大骗局
- 推荐系统中协同过滤算法实现分析
- mysql 卸载插件_MySQL 插件安装或卸载(window validate_password 为例)
- 计算机数控是什么专业,数控是什么专业
- weblogic修改控制台ip_「Weblogic学习」Weblogic知识要点之JNDI/JTA编程开发
- deb包如何改支持12系统_对一个deb包的解压、修改、重新打包全过程方法
- [数据结构]邻接矩阵和邻接表存储的图DFS,BFS算法时间复杂度分析
- Docker镜像讲解
- java中factory方法_Java的23中设计模式--工厂方法模式(Factory Method)