牛客多校Round 1
2024-08-30 21:59:21
Solved:1
rank:249
E. Removal
dp i,j表示前i个数删除了j个且选择了第i个的答案
类似字符串的dp 预处理一下nex i_k即i后面k第一次出现的位置 就好转移了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + ; int s[];
int nex[][];
int now[];
ll dp[][]; int main()
{
int n, m, kk;
while(~scanf("%d%d%d", &n, &m, &kk))
{
memset(dp, , sizeof(dp));
for(int i = ; i <= n; i++) scanf("%lld", &s[i]);
for(int i = ; i <= kk; i++) now[i] = n + ; for(int i = n; i >= ; i--)
{
for(int j = ; j <= kk; j++) nex[i][j] = now[j];
now[s[i]] = i;
} dp[][] = ; //dp[0][0] = 1;
for(int i = ; i <= n; i++)
{
for(int j = ; j <= m; j++)
{
if(!dp[i][j]) continue;
for(int k = ; k <= kk; k++)
{
int t = nex[i][k];
if(t == n + ) continue;
if(t - i + j - > m) continue;
(dp[t][t - i + j - ] += dp[i][j]) %= mod;
}
}
} ll ans = ;
for(int i = ; i <= n; i++)
if(i - n + m >= )
(ans += dp[i][i - n + m]) %= mod;
printf("%lld\n", ans);
}
return ;
}
最新文章
- [转]Android - 文件读写操作 总结
- C(++) Websocket实现扫码二维码登录---GoEasy
- REST API (from IBM)
- ecshop添加上传图片
- Linux------小网盘(1)
- asp.net core中Microsoft.AspNet.Session的使用
- Blog 入职新公司的一些吐槽!
- 有图有真相,分享一款网页版HTML5飞机射击游戏
- C# 线程知识--使用ThreadPool执行异步操作
- [置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 &; 8?
- QT开发应用程序的欢迎界面
- LSTM编程所用函数
- cf1136E. Nastya Hasn&#39;t Written a Legend(二分 线段树)
- UVA1608-Non-boring sequences(分治)
- BZOJ5010 FJOI2017矩阵填数(容斥原理)
- [daily] 使用左右对比查看diff 格式的文件
- xsync
- python string tuple list dict 相互转换的方法
- Windows 作为 openssl server端时的处理
- JAVA基础之——Thrift原理及应用