Codeforces 1000D dp
注意对题意的理解,对于给出的序列,我们需要找出他满足要求的子序列,然后对于每个子序列,再把它分成几个满足要求的子串 。
对于任意一个元素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相关推荐
- 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 ...
- CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)
CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...
- Codeforces 1000D Yet Another Problem On a Subsequence 【dp】【组合数学】
难点在于怎么想dp,我一开始想dp[i][j]代表前i个数挑j个能组成多少个good sebsequence,最后把dp[n][ 2到n ]加起来就行,但想不出来转移方程怎么做.后来想到我这么想是不对 ...
- c语言鸽巢原理,Codeforces 1188C DP 鸽巢原理
题意:定义一个序列的beauty值为序列中元素之差绝对值的最小值,现在给你一个数组,问所有长度为k的子序列的beauty值的和是多少? 思路:(官方题解)我们先解决这个问题的子问题:我们可以求出bea ...
- codeforces的dp专题
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...
- CodeForces 567F DP Mausoleum
本着只贴代码不写分析的题解是在耍流氓的原则,还是决定写点分析. 思路很清晰,参考的官方题解,一下文字仅对题解做一个简要翻译. 题意: 有1~n这n个数,每个数用两次.构成一个长为2n的序列,而且要求序 ...
- CodeForces - 1000D Yet Another Problem On a Subsequence(动态规划+组合数学)
题目链接:点击查看 题目大意:给出n个数字组成的序列,现在规定"好数组"指的是一个连续序列a1,a2,...ak的a1=k-1,再规定"好序列"是可以分为若干个 ...
- G - Hard problem CodeForces - 706C DP
#include<bits/stdc++.h> using namespace std;typedef long long ll; string a[100000 +10], b[1000 ...
- Codeforces 1096F(dp + 树状数组)
题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...
最新文章
- 创建多个Oracle数据库及相应的实例
- “面试不败计划“:hibernate和mybatis比较
- query什么意思php,关于 QueryPHP
- iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
- GNS3桥接modem拨号and QOS限速
- 10.Springcloud的Zuul
- 简单报价单模板_圣诞节祝福邮件必这样写【附件参考模板BY埃马】
- video标签详解(转载)
- cv如何连接mysql_Naicvat操作数据库的基本操作
- python开发mbus程序_一种PMBus总线电源模块的控制与实现
- OCR文字识别技术总结(一)
- Android布局小案例——安卓版计算器
- 面向对象:上得厅堂,下得厨房,站起来杀猪,坐下来写书
- limt mysql操作
- Kubernetes v1.10.4 安装记录
- 傅里叶变换与小波分析
- 达梦数据库安装及连接
- Steam 网络联机配置代码
- linux peek,Peek - Gif 录制软件
- flash游戏代码html5,Flash贪吃蛇游戏AS代码翻译