链接: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 ;
}

最新文章

  1. ArcGIS Engine开发之量测功能
  2. [Prodinner项目]学习分享_第四部分(完结篇)_Controller层(控制器)
  3. 9.Python笔记之面向对象高级部分
  4. http协议传输二进制数据以及对输入流(php://input)和http请求的理解
  5. 94、EventBus框架 ---- 转载
  6. html5游戏引擎-Pharse.js学习笔记(一)
  7. Java批处理操作
  8. JQuery动画animate的stop方法使用详解
  9. Entity Framework+SQLite+DataBaseFirst
  10. mvc 中Range中max和min值晚绑定
  11. 分布式系统Paxos算法
  12. Why is 'x' in ('x',) faster than 'x' == 'x'?
  13. Window下PHP三种运行方式图文详解,window下的php是不是单进程的?
  14. git push时报错fatal: Could not read from remote repository.
  15. C#实现foreach
  16. 脚本其实很简单-windows配置核查程序(1)
  17. 2013暑假江西联合训练赛 -- by jxust_acm 解题报告
  18. 并发-HashMap和HashTable源码分析
  19. git从远程仓库中更新代码到本地仓库
  20. msp430入门学习43

热门文章

  1. PAT——1041. 考试座位号
  2. Android ProgressBar 进度条荧光效果
  3. Jfinal框架登陆页面的图形验证码
  4. DPI在SDN中的部署方式
  5. 我的QT5学习之路(四)——信号槽
  6. MySQL语句的优化
  7. Mave实战(1)——Maven介绍
  8. crontab基础笔记 思维导图版
  9. 学习ThinkPHP5的第一天(安装 连接数据库)
  10. Delphi XE7的蓝牙 Bluetooth