Removal

题意:一个长为n(1e5)的序列,序列中每个数<=k,现在删除m(<=10)个位置的数 。问有多少种不同的序列

思路:

DP。设dp[i][j]为到第i个位置,删除j个有多少个不同的序列. 接下来就去找后面跟1~k是不是存在即可。

#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
#define F first
#define S second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e5+5;
const int MOD=1e9+7;
template <class T>
bool sf(T &ret){ //Faster Inputchar c; int sgn; T bit=0.1;if(c=getchar(),c==EOF) return 0;while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();sgn=(c=='-')?-1:1;ret=(c=='-')?0:(c-'0');while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');if(c==' '||c=='\n'){ ret*=sgn; return 1; }while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;ret*=sgn;return 1;
}
int a[N];
int nt[N][20];
ll dp[N][20];
int pos[20];
int cnt[11];
int n,m,k;
void init(){memset(pos,0,sizeof pos);memset(cnt,0,sizeof cnt);for(int i = 0; i <= n; i++)for(int j = 0; j <= 10; j++)dp[i][j] = nt[i][j] = 0;
}
int main(void){while((scanf("%d%d%d",&n,&m,&k))==3){init();for(int i=1;i<=n;i++)   sf(a[i]);
//        for(int i=1;i<=k;i++)
//            if(cnt[i])  dp[1][0]++;for(int i=n;i>=0;i--){for(int j=1;j<=k;j++){nt[i][j]=pos[j];}pos[a[i]]=i;}
//        for(int j=1;j<=k;j++)   cout <<"~"<< nt[1][j]<<endl;dp[0][0]=1;for(int i=0;i<=n;i++){for(int j=0;j<=m;j++){for(int num=1;num<=k;num++){if(nt[i][num]-i-1+j>m || !nt[i][num])  continue;dp[nt[i][num]][nt[i][num]-i-1+j]+=dp[i][j];dp[nt[i][num]][nt[i][num]-i-1+j]%=MOD;
//                    cout <<i <<" "<<j<<" "<<k<<endl;}}}
//        cout <<"debug"<<endl;ll ans=0;for(int i=n;i>=1;i--){if(m-(n-i)>=0)   ans=(ans+dp[i][m-(n-i)])%MOD;}ans%=MOD;printf("%lld\n",ans);}return 0;
}

Removal【套路DP】相关推荐

  1. leetcode 123. Best Time to Buy and Sell Stock III | 123. 买卖股票的最佳时机 III(总结DP 模型套路)

    题目 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/ DP 模型套路 DP 套路之:暴力递 ...

  2. 精简改良(生成树dp)

    精简改良 尚未提交 尚未通过 时间限制:2000ms 内存限制:256MB 0.00% 提交人数:1 通过人数:0 题目描述   可怜最近在玩一款硬核战争游戏. 可怜控制的国家有 nn 座城市,在 n ...

  3. P3041 [USACO12JAN]Video Game Combos【AC自动机+DP】

    时空限制 1000ms / 128MB 题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', an ...

  4. BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]

    1444: [Jsoi2009]有趣的游戏 题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率 套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩 ...

  5. [LeetCode周赛复盘] 第 314 场周赛20221009

    [LeetCode周赛复盘] 第 314 场周赛20221009 一.本周周赛总结 二. [Easy] 6201. 找出前缀异或的原始数组 1. 题目描述 2. 思路分析 3. 代码实现 三.[Eas ...

  6. 【[BJOI2017]魔法咒语】

    矩阵乘法+\(AC\)自动机 是道很不错的题了 首先是前六十分,就是一个\(AC\)自动机上的套路\(dp\),设\(dp[i][j]\)表示匹配出的长度为\(i\)在自动机上位置为\(j\)的方案数 ...

  7. Before NOIP 2018

    目录 总结 刷题 2018 - 9 - 24 2018 - 9 - 25 2018 - 9 - 26 2018 - 9 - 27 2018 - 9 - 28 2018 - 9 - 29 2018 - ...

  8. 左神算法:判断二叉树是否为平衡二叉树(树形dp套路,Java版)

    本题来自左神<程序员代码面试指南>"判断二叉树是否为平衡二叉树"题目. 题目 平衡二叉树的性质为:要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过 1. ...

  9. leetcode 235. 二叉搜索树的最近公共祖先(Java版,树形dp套路)

    题目 原题地址:leetcode 235. 二叉搜索树的最近公共祖先 说明: 所有节点的值都是唯一的. p.q 为不同节点且均存在于给定的二叉搜索树中. 题解 关于 树形dp 套路,可以参考我的另一篇 ...

最新文章

  1. ElasticSearch安装使用 操作索引
  2. 如何在vc的拆分窗口中使用CFormView派生类
  3. win2012R2打Windows8.1-KB2919355 问题
  4. C++作用域为类的常量
  5. Linux (redhat 6.5)服务器上安装Webmin
  6. QT的QReadLocker类的使用
  7. 积跬步,聚小流-------js实现placeholder的效果
  8. 安装jdk后出现bash: ./java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录
  9. 【C++学习笔记一】C++类和对象详解
  10. plsql轻量版游标的使用2
  11. 关于计算机网络的未来综述,计算机网络综述
  12. 小程序开发过程注意事项
  13. parse python函数_Python爬虫 - parse模块常用方法
  14. What are your list of must know programming proverbs ?
  15. [XA]读书感想:个人对敏捷软件开发宣言的理解
  16. python水仙花数
  17. 我收集的软件序列号(转帖)
  18. iptables 性能 测试
  19. 高效能人士的七个习惯(一)由内而外全面造就自己
  20. Java 桌球小游戏

热门文章

  1. 大学物理 复习指导、公式推导精简过程、结论归纳 第三章 动量守恒定律与能量守恒定律
  2. 01-MySQL 创建数据库
  3. 让人癫狂的24号,请你慢点离开
  4. ie浏览器设置允许跨域_ieTester允许跨域浏览窗口和框架
  5. 论架构师的自我修养--8荣
  6. getRemoteAddr和getLocalAddr的区别
  7. 计算机专业学自我分析,计算机专业学习自我鉴定(精选6篇)
  8. 【蓝桥杯真题】成绩统计
  9. 李嘉诚的人生感悟(ZT)
  10. Amelia:下一代WordPress预订插件