牛客网暑期ACM多校训练营(第一场):E-Removal(DP)
2024-10-19 03:28:54
链接:E-Removal
题意:给出序列 s1, s2, ..., sn ,1<=s[i]<=10。问删除m个数后,有多少种不同的序列。
题解:定义dp[i][j]代表长度为i,最末尾的数字为j的子序列方案数,sum[i]代表长度为i的子序列个数。
sum[0] = 1。
从 1 ~ n 遍历序列,当遍历到 s[i] 时 sum[1] ~ sum[i] 就会增加一些以 s[i] 结尾的情况。状态转移:sum[j] += (sum[j-1] - dp[j][s[i]]) % mod。多增加的情况就是 sum[j-1] 后面在增加一个 s[i] ,但是如果以 s[i] 结尾的序列以前就出现过,那么新增加的情况中就会有 dp[j][s[i]] 个重复的情况,减去即可。dp[j][s[i]] = sum[j-1],因为结尾是 s[i] 已经定了,能变得就只剩下前面 j-1 个了。
#include <bits/stdc++.h>
using namespace std; const double EPS = 1e-;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
const int maxn = 1e5 + ;
int n, m, k;
int s[maxn];
long long dp[maxn][];
long long sum[maxn]; int main()
{
while(scanf("%d%d%d", &n, &m, &k) != EOF){
for(int i = ; i <= n; i++) scanf("%d", &s[i]); memset(dp, , sizeof(dp));
memset(sum, , sizeof(sum)); sum[] = ;
for(int i = ; i <= n; i++){
for(int j = i; j >= && j >= i - m; j--){
sum[j] += (sum[j-] - dp[j][s[i]]) % mod;
dp[j][s[i]] = sum[j-];
}
} printf("%lld\n", (sum[n-m] % mod + mod) % mod);
} return ;
}
最新文章
- ArcGIS Engine开发之量测功能
- [Prodinner项目]学习分享_第四部分(完结篇)_Controller层(控制器)
- 9.Python笔记之面向对象高级部分
- http协议传输二进制数据以及对输入流(php://input)和http请求的理解
- 94、EventBus框架 ---- 转载
- html5游戏引擎-Pharse.js学习笔记(一)
- Java批处理操作
- JQuery动画animate的stop方法使用详解
- Entity Framework+SQLite+DataBaseFirst
- mvc 中Range中max和min值晚绑定
- 分布式系统Paxos算法
- Why is 'x' in ('x',) faster than 'x' == 'x'?
- Window下PHP三种运行方式图文详解,window下的php是不是单进程的?
- git push时报错fatal: Could not read from remote repository.
- C#实现foreach
- 脚本其实很简单-windows配置核查程序(1)
- 2013暑假江西联合训练赛 -- by jxust_acm 解题报告
- 并发-HashMap和HashTable源码分析
- git从远程仓库中更新代码到本地仓库
- msp430入门学习43