题目链接:点击查看

题目大意:给出n个数字组成的序列,现在规定“好数组”指的是一个连续序列a1,a2,...ak的a1=k-1,再规定“好序列”是可以分为若干个“好数组”的序列,现在问这n个数字中有多少个子序列是“好序列”

题目分析:这个题目的好数组+好序列=好序列,而且好数组只与第一项有关,所以我们可以从后向前递推,dp[i]代表的是i~n之中好序列的个数,这样我们设计出的转移方程就是for(j:a[i]+i+1,n+1),dp[i]=dp[j]*c[j-i-1][a[i]],后面的c数组表示的是组合数,c[a][b]代表的就是从a中选b个物品的方案数,我们直接用C就可以求出当前j-i-1这段区间中能组合出多少种以i为开头的好数组,然后搭配上第j位置上的好序列的个数,就可以一直向前递推了,时间复杂度是n*n

烦人的dp。。我的dp真的是一点都不会,哭了,能看懂别人设计的转移方程,但自己就是设计不出来

对了,这里需要解释一下为什么要将dp[n+1]设置为1,因为我们以上都是考虑的好数组+好序列构成的好序列,而忘记了好数组单独也能成为一个好序列,所以我们将最后的位置放宽到n+1,这样就能正确枚举所有好数组单独构成的好序列了

这个题目也是让我学到了组合数还能用递推的形式O(n)打表,公式:

C[i][j]=C[i-1][j-1]+C[i-1][j]

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;const int mod=998244353;int a[N];LL c[N][N],dp[N];void init()//预处理组合数
{for(int i=1;i<N;i++)for(int j=1;j<N;j++){if(j==1)c[i][j]=i;elsec[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;}
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);init();int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",a+i);dp[n+1]=1;//将位置放宽到n+1for(int i=n-1;i>=1;i--)//枚举每个位置{if(a[i]<=0||a[i]+i>n)continue;for(int j=a[i]+i+1;j<=n+1;j++)//记录每个位置的贡献dp[i]=(dp[i]+dp[j]*c[j-i-1][a[i]]%mod)%mod;}LL ans=0;for(int i=0;i<n;i++)ans=(ans+dp[i])%mod;printf("%lld\n",ans);return 0;
}

CodeForces - 1000D Yet Another Problem On a Subsequence(动态规划+组合数学)相关推荐

  1. Codeforces 1000D Yet Another Problem On a Subsequence 动态规划

    D. Yet Another Problem On a Subsequence time limit per test 2 seconds memory limit per test 256 mega ...

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

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

  3. Codeforces 1000D Yet Another Problem On a Subsequence

    题目:点击打开链接 题意:定义一个数列是"好的":第一个数字a[0]为数列长度+1.定义一个数列的子序列是"好的":这个子序列能分割成几个"好的&qu ...

  4. CodeForces - 1000D Yet Another Problem On a Subsequence

    题面在这里! 好智障的一个dp啊,一段开头的数字相当于下面要跟多少个数,直接滚动数组dp就行了... #include<bits/stdc++.h> #define ll long lon ...

  5. 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 ...

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

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

  7. CodeForces - 1000D D. Yet Another Problem On a Subsequence 好题

    D. Yet Another Problem On a Subsequence time limit per test 2 seconds memory limit per test 256 mega ...

  8. Codeforces 776D The Door Problem

    题目链接:http://codeforces.com/contest/776/problem/D 把每一个钥匙拆成两个点${x,x+m}$,分别表示选不选这把钥匙. 我们知道一扇门一定对应了两把钥匙. ...

  9. codeforces C. Sonya and Problem Wihtout a Legend(dp or 思维)

    题目链接:http://codeforces.com/contest/713/problem/C 题解:这题也算是挺经典的题目了,这里附上3种解法优化程度层层递进,还有这里a[i]-i<=a[i ...

最新文章

  1. iOS - Swift NSEnumerator 迭代器
  2. exe4j 报错 找不到class
  3. Ubuntu下安装Oracle11g(图文教程)
  4. MySQL 三种关联查询的方式: ON vs USING vs 传统风格
  5. 10种电脑无法启动故障
  6. ARcgis常用符号库(含字体库)_三调_二调_规划等
  7. 热力地图高德_《高德地图》城市热力图开启查看方法
  8. openCms安装技巧
  9. vue项目退出登录清除 store 数据
  10. 助力金融科技产业发展 360金融AI之夜成功举办
  11. Android Audio 音频输出设备切换
  12. 我将进化成一条狗(5)——VR和AR
  13. 2018“人工智能”:是彻底复苏?还是起落轮回?| 抢票
  14. Haproxy+Keepalived+MySQL高可用均衡负载部署
  15. HTML及CSS学习笔记 06 - CSS简介和常见的选择器
  16. 今天起,属于Windows 7的时代结束了...
  17. 十进制转十六进制 代码
  18. linux中jdk环境配置,安装MySQL,配置Hadoop伪分布式,配置hive环境
  19. 资源共享(好东西,要分享)
  20. 计算机机房的日常维护,机房日常八大维护措施

热门文章

  1. Redis数据库操作指令
  2. 工作中用到的设计模式?
  3. 搭建基础架构-QueryRule
  4. 任务调度之Quartz1
  5. 字节输入流读取字节数据
  6. StringBuilder的构造方法和append方法
  7. plsql编程语言定义变量
  8. Feign-2覆写Feign的默认配置
  9. SpringBoot AOP拦截器
  10. Python MongoDB--PyMongo