注意对题意的理解,对于给出的序列,我们需要找出他满足要求的子序列,然后对于每个子序列,再把它分成几个满足要求的子串
对于任意一个元素i,我们需要至少往后面走a[i]位,然后从i+a[i]+1开始直到结尾,以这些开头的子序列都可以和i开头的子序列连在一起,对于一个j,以i开头,长度为a[i]+1的子序列可以选出C[j-i-1][a[i]]种,所以要用组合数乘上dp[j],再把对于每个j的值加到一起即可。
这里有转移方程的表示

还有要注意的是为了作为dp起点的dp[n+1]应该设为1。

#include <iostream>
#include <math.h>
#include <iomanip>
#include <string>
#include <cstdio>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define INF 0x3f3f3f3f
#define N 1010
#define M 998244353
#define ll long long
using namespace std;int arr[N];
ll dp[N];
ll c[N][N];
int n;
int main() {int i,j,k;for(i=0;i<N;i++){c[i][0] = c[i][i] = 1;c[i][1] = i;}for(i=2;i<N;i++){for(j=2;j<i;j++){c[i][j] = (c[i-1][j-1] + c[i-1][j])%M;}}scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&arr[i]);}dp[n+1] = 1;for(i=n-1;i>=1;i--){if(arr[i] > 0){for(j = i + arr[i] + 1;j <= n+1;j++){dp[i] += c[j-i-1][arr[i]] * dp[j];dp[i]%=M;}}}ll ans = 0;for(i=1;i<=n;i++){ans = (ans + dp[i])%M;}printf("%lld\n",ans);return 0;
}

Codeforces 1000D dp相关推荐

  1. D - Yet Another Problem On a Subsequence CodeForces - 1000D (DP,组合数学)

    D - Yet Another Problem On a Subsequence CodeForces - 1000D The sequence of integers a1,a2,-,aka1,a2 ...

  2. CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)

    CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...

  3. Codeforces 1000D Yet Another Problem On a Subsequence 【dp】【组合数学】

    难点在于怎么想dp,我一开始想dp[i][j]代表前i个数挑j个能组成多少个good sebsequence,最后把dp[n][ 2到n ]加起来就行,但想不出来转移方程怎么做.后来想到我这么想是不对 ...

  4. c语言鸽巢原理,Codeforces 1188C DP 鸽巢原理

    题意:定义一个序列的beauty值为序列中元素之差绝对值的最小值,现在给你一个数组,问所有长度为k的子序列的beauty值的和是多少? 思路:(官方题解)我们先解决这个问题的子问题:我们可以求出bea ...

  5. codeforces的dp专题

    1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...

  6. CodeForces 567F DP Mausoleum

    本着只贴代码不写分析的题解是在耍流氓的原则,还是决定写点分析. 思路很清晰,参考的官方题解,一下文字仅对题解做一个简要翻译. 题意: 有1~n这n个数,每个数用两次.构成一个长为2n的序列,而且要求序 ...

  7. CodeForces - 1000D Yet Another Problem On a Subsequence(动态规划+组合数学)

    题目链接:点击查看 题目大意:给出n个数字组成的序列,现在规定"好数组"指的是一个连续序列a1,a2,...ak的a1=k-1,再规定"好序列"是可以分为若干个 ...

  8. G - Hard problem CodeForces - 706C DP

    #include<bits/stdc++.h> using namespace std;typedef long long ll; string a[100000 +10], b[1000 ...

  9. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

最新文章

  1. 创建多个Oracle数据库及相应的实例
  2. “面试不败计划“:hibernate和mybatis比较
  3. query什么意思php,关于 QueryPHP
  4. iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
  5. GNS3桥接modem拨号and QOS限速
  6. 10.Springcloud的Zuul
  7. 简单报价单模板_圣诞节祝福邮件必这样写【附件参考模板BY埃马】
  8. video标签详解(转载)
  9. cv如何连接mysql_Naicvat操作数据库的基本操作
  10. python开发mbus程序_一种PMBus总线电源模块的控制与实现
  11. OCR文字识别技术总结(一)
  12. Android布局小案例——安卓版计算器
  13. 面向对象:上得厅堂,下得厨房,站起来杀猪,坐下来写书
  14. limt mysql操作
  15. Kubernetes v1.10.4 安装记录
  16. 傅里叶变换与小波分析
  17. 达梦数据库安装及连接
  18. Steam 网络联机配置代码
  19. linux peek,Peek - Gif 录制软件
  20. flash游戏代码html5,Flash贪吃蛇游戏AS代码翻译

热门文章

  1. Python__绘制动态时钟表
  2. android 心率测试,用手机测量你的心跳!安卓心电图App试用
  3. 宝付职场:与其等着被淘汰不如主动去出击
  4. 面向对象的六大原则之 接口隔离原则——ISP
  5. NR/5G - On demand SI
  6. JavaWeb项目在Tomcat中的部署
  7. 清览题库--C语言程序设计第五版编程题解析(2)
  8. 初学者对测绘软件的了解
  9. NOJ 2094 以撒的谜题 (费用流)
  10. EcmaScript 6 新特性