链接:

时间限制: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相关推荐

  1. 牛客网 每日一题 7月23日题目精讲—wpy的请求

    来源:牛客网: 文章目录 wpy的请求 题解: 代码: wpy的请求 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge ...

  2. 牛客网【每日一题】5月27日题目精讲 货币系统

    链接: 文章目录 题目描述 题解: 代码: 题目描述 在网友的国度中共有n种不同面额的货币,第i种货币的面额为a[i],你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为n.面额数组为a[1 ...

  3. 【每日一题】8月27日题目精讲 Is It A Tree?

    链接:https://ac.nowcoder.com/acm/problem/105905 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 10000K,其他语言2000 ...

  4. 牛客网 【每日一题】7月27日题目精讲—乌龟棋

    来源:牛客网: 乌龟棋 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 文章目录 乌龟棋 题目描述 ...

  5. 【每日一题】8月28日题目精讲 编号

    [每日一题]8月28日题目精讲 编号 链接:https://ac.nowcoder.com/acm/problem/19925 来源:牛客网 题目描述 你需要给一批商品编号,其中每个编号都是一个7位1 ...

  6. 【每日一题】7月17日题目精讲—BOWL 碗的叠放

    [每日一题]7月17日题目精讲-BOWL 碗的叠放 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld ...

  7. 【每日一题】7月15日题目精讲—生日快乐

    [每日一题]7月15日题目精讲-生日快乐 [SCOI2009]生日快乐 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO For ...

  8. 【每日一题】7月13日题目精讲—Kingdom

    [每日一题]7月13日题目精讲-Kingdom 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 1048576K,其他语言2097152K 64bi ...

  9. 【牛客每日一题】tokitsukaze and Soldier 题目精讲 贪心、优先队列、堆

    链接:https://ac.nowcoder.com/acm/problem/50439 来源:牛客网 ACM在线模板 今天才发现牛客推出了一个每日一题的版块,3月25号就开始了,今天才发现,赶紧补救 ...

最新文章

  1. 乐高机器人教室布置图片大全_全国青少年机器人技术等级考试(上海宝山站)顺利举行...
  2. UVa11292 - Dragon of Loowater(贪心)
  3. sql join on 多表连接_阿里规范不建议多表Join,可这SQL要怎么写啊?
  4. maven 添加本地库
  5. 太原工业学院单片机课程设计_单片机智能小车毕业设计论文
  6. RCurl网络数据抓取
  7. lenovo X230热键功能
  8. 在AVEVA PDMSE3D软件实现三维二维码模型
  9. 用Java实现JVM第五章《指令集和解释器》
  10. Apache运行模式MPM详解
  11. anaconda离线安装pytorch
  12. Java项目名前有红色感叹号怎么解决
  13. 微信V3接口商家转账到零钱
  14. 小米笔记本降价销售或预示其销售未如理想
  15. MySQL insert 插入优化技巧,MySQL 优化学习第8天
  16. 《Hyperledger Fabric官方文档》区块链的网络
  17. 【第一届“文翁杯”现场竞技赛】T2 —蜀石经(优先队列模拟)
  18. 魔兽世界你无法向该服务器发邮件什么意思,魔兽世界:对于怀旧服无法上线的3大原因!暴雪是这样解释的!...
  19. Npoi html导入到excel,.net mvc 利用NPOI导入导出excel
  20. Edge打不开中国知网的一次经历

热门文章

  1. 推荐7个高质量的学术公众号
  2. 震惊整个世界的新发现,科学界的大骗局
  3. 推荐系统中协同过滤算法实现分析
  4. mysql 卸载插件_MySQL 插件安装或卸载(window validate_password 为例)
  5. 计算机数控是什么专业,数控是什么专业
  6. weblogic修改控制台ip_「Weblogic学习」Weblogic知识要点之JNDI/JTA编程开发
  7. deb包如何改支持12系统_对一个deb包的解压、修改、重新打包全过程方法
  8. [数据结构]邻接矩阵和邻接表存储的图DFS,BFS算法时间复杂度分析
  9. Docker镜像讲解
  10. java中factory方法_Java的23中设计模式--工厂方法模式(Factory Method)