Removal【套路DP】
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】相关推荐
- 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 套路之:暴力递 ...
- 精简改良(生成树dp)
精简改良 尚未提交 尚未通过 时间限制:2000ms 内存限制:256MB 0.00% 提交人数:1 通过人数:0 题目描述 可怜最近在玩一款硬核战争游戏. 可怜控制的国家有 nn 座城市,在 n ...
- P3041 [USACO12JAN]Video Game Combos【AC自动机+DP】
时空限制 1000ms / 128MB 题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', an ...
- BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]
1444: [Jsoi2009]有趣的游戏 题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率 套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩 ...
- [LeetCode周赛复盘] 第 314 场周赛20221009
[LeetCode周赛复盘] 第 314 场周赛20221009 一.本周周赛总结 二. [Easy] 6201. 找出前缀异或的原始数组 1. 题目描述 2. 思路分析 3. 代码实现 三.[Eas ...
- 【[BJOI2017]魔法咒语】
矩阵乘法+\(AC\)自动机 是道很不错的题了 首先是前六十分,就是一个\(AC\)自动机上的套路\(dp\),设\(dp[i][j]\)表示匹配出的长度为\(i\)在自动机上位置为\(j\)的方案数 ...
- Before NOIP 2018
目录 总结 刷题 2018 - 9 - 24 2018 - 9 - 25 2018 - 9 - 26 2018 - 9 - 27 2018 - 9 - 28 2018 - 9 - 29 2018 - ...
- 左神算法:判断二叉树是否为平衡二叉树(树形dp套路,Java版)
本题来自左神<程序员代码面试指南>"判断二叉树是否为平衡二叉树"题目. 题目 平衡二叉树的性质为:要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过 1. ...
- leetcode 235. 二叉搜索树的最近公共祖先(Java版,树形dp套路)
题目 原题地址:leetcode 235. 二叉搜索树的最近公共祖先 说明: 所有节点的值都是唯一的. p.q 为不同节点且均存在于给定的二叉搜索树中. 题解 关于 树形dp 套路,可以参考我的另一篇 ...
最新文章
- ElasticSearch安装使用 操作索引
- 如何在vc的拆分窗口中使用CFormView派生类
- win2012R2打Windows8.1-KB2919355 问题
- C++作用域为类的常量
- Linux (redhat 6.5)服务器上安装Webmin
- QT的QReadLocker类的使用
- 积跬步,聚小流-------js实现placeholder的效果
- 安装jdk后出现bash: ./java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录
- 【C++学习笔记一】C++类和对象详解
- plsql轻量版游标的使用2
- 关于计算机网络的未来综述,计算机网络综述
- 小程序开发过程注意事项
- parse python函数_Python爬虫 - parse模块常用方法
- What are your list of must know programming proverbs ?
- [XA]读书感想:个人对敏捷软件开发宣言的理解
- python水仙花数
- 我收集的软件序列号(转帖)
- iptables 性能 测试
- 高效能人士的七个习惯(一)由内而外全面造就自己
- Java 桌球小游戏