AtCoder Grand Contest 024 Problem E(动态规划)

www.cnblogs.com/shaokele/


AtCoder Grand Contest 024 Problem E

  Time Limit: 2 Sec
  Memory Limit: 1024 MB

Description

  Find the number of the possible tuples of sequences (\(A_0,A_1,…,A_N\)) that satisfy all of the following conditions, modulo \(M\):
  ? For every \(i\) \((0≤i≤N)\), \(A_i\) is a sequence of length \(i\) consisting of integers between \(1\) and \(K\) (inclusive);
  ? For every \(i\) \((1≤i≤N)\), \(A_{i-1}\) is a subsequence of \(A_i\), that is, there exists \(1≤x_i≤i\) such that the removal of the \(x_i\)-\(th\) element of \(A_i\) would result in a sequence equal to \(A_{i-1}\);
  ? For every \(i\) \((1≤i≤N)\), \(A_i\) is lexicographically larger than \(A_{i-1}\).
  

Input

  ? \(1≤N,K≤300\)
  ? \(2≤M≤109\)
  ? \(N, K\) and \(M\) are integers.
  
  Input is given from Standard Input in the following format:
  \(N K M\)
  

Output

  Print the number of the possible tuples of sequences \((A_0,A_1,…,A_N)\), modulo \(M\).
  

Sample Input 1

  2 2 100
 

Sample Output 1

  5
  
  Five tuples below satisfy the conditions:
  ? (),(1),(1,1)
  ? (),(1),(1,2)
  ? (),(1),(2,1)
  ? (),(2),(2,1)
  ? (),(2),(2,2)
  

Sample Input 2

  4 3 999999999
 

Sample Output 2

  358
  

Sample Input 3

  150 150 998244353
 

Sample Output 3

  186248260
  

题目地址:  AtCoder Grand Contest 024 Problem E

题目大意:

  考虑 \(N + 1\) 个数组 \({A_0, A_1, . . . , A_N }\)。
  其中 \(A_i\) 的长度是 \(i\),$A_i $内的所有数字都在 \(1\) 到 \(K\) 之间。
  \(A_{i?1}\) 是 \(A_i\) 的?序列,即 \(A_i\) 删?个数字可以得到 \(A_{i?1}\)。
  \(A_i\) 的字典序?于 \(A_{i?1}\)。
  输? \(N, K, M\) 问序列个数模 \(M\)。

题解:

  我们可以认为 \(A_i\) 是 \(A_{i?1}\) 插??个数字 \(x\) 得到的。
  为了让字典序变?,插?的 \(x\) 必须严格?于插?位置右侧的数字。
  题目解法一
  序列可以转化为?个树。
  ?个节点有 2 个属性,时间和权值。
  ?个节点的?亲节点,是插?位置右侧的,如果插?在末尾,右侧为空,那么?亲节点是 (0, 0)。
  时间必须唯?,权值可以是 \(1\) 到 \(K\) 之间任选。
  每个点的时间和权值必须严格?于?亲节点的时间和权值。
   \(f[i][x]\) 表???为 \(i\) 的?树,根节点权值为 \(x\) 的?案数。
  \[f[i][x]=\sum_{1≤j≤i?1}\sum_{x<y≤K} f[i ? j][x] ? f[j][y] ? C(i ? 2, j ? 1)\]
  $\sum_{x<y≤K}f[j][y] $ 可以?部分和优化存。
  类似树形 DP 做?下就?了。
  参考代码
  题目解法二
  上??个做法,?较容易理解,但是写起来稍微?烦。需要预处理组合数。
  原本是元素?个?个加?进序列,序列慢慢变长。
  现在我们考虑,从?到?加?所有的元素。显然有先加??的,再加??的情况。
  加?较?元素的时候,我们不仅可以再最后?个序列中加?,也可以在之前的序列中加?。
  设 \(f[i][v][p]\),当前长度为 \(i\),从?到?依次插?权值,已插?到 \(v\),考虑在第 \(p\) 个序列加?。
  核?思想是从?到?插?权值,但是这样可能漏掉?些情况(先插??权值,再插??权值。)
  \(p\) 就为了解决这个问题,允许我们修改从前的过程。
  转移:
  \(f[i][v][p ? 1]+ = f[i][v][p]\) 不加?,考虑在第 \(p ? 1\) 个序列加?,要求 \((p > 0)\)。
  \(f[i][v + 1][i]+ = f[i][v][p]\) 换更?的值,如果已经尝试到第 \(0\) 个序列了,要求 \((p = 0)\)。
  \(f[i + 1][v][p]+ = f[i][v][p] ? (p + 1)\) 插??个,注意即使加?,下?次依然是第 \(p\) 个序列,?不是 \(p + 1\)。
  空间复杂度 \(O(KN^2)\),可以优化为 \(O(KN)\)。
  



AC代码

#include <cstdio>
using namespace std;
int N,K,mo;
int dp[305][305];
int main(){
    scanf("%d%d%d",&N,&K,&mo);
    dp[0][0]=1;
    for(int i=0;i<=N;i++)
        for(int j=0;j<K;j++)
            for(int k=i;k>=0;k--){
                if(k)dp[j][k-1]=(dp[j][k-1]+dp[j][k])%mo;
                else dp[j+1][i]=(dp[j+1][i]+dp[j][k])%mo;
                dp[j][k]=1ll*dp[j][k]*(k+1)%mo;
            }
    printf("%d\n",dp[K][N]);
    return 0;
}

原文地址:https://www.cnblogs.com/shaokele/p/9280924.html

时间: 2024-10-04 15:49:20

AtCoder Grand Contest 024 Problem E(动态规划)的相关文章

AtCoder Grand Contest 025 Problem D

www.cnblogs.com/shaokele/ AtCoder Grand Contest 025 Problem D Time Limit: 2 Sec Memory Limit: 1024 MB Description Takahashi is doing a research on sets of points in a plane. Takahashi thinks a set \(S\) of points in a coordinate plane is a good set w

AtCoder Grand Contest 025 Problem D - Choosing Points

题目大意:输入$n,d1,d2$,你要找到$n^2$个整点 x, y 满足$0 \leqslant x, y<2n$.并且找到的任意两个点距离,既不是$\sqrt{d1}$,也不是 $\sqrt{d2}$. 题解:如果$d mod 2=1$,如果$a^2+b^2=d$,a和b一定一奇一偶,按国际象棋黑白染色即可.如果$d mod 4=2$,如果$a^2+b^2=d$,a和b一定都是奇数,一行黑色,一行白色即可.如果$d mod 4=0$,把$2×2$的区域看成一个大格子,对$d/4$进行如上考虑

AtCoder Grand Contest 011

AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\(n\)个乘客到达了飞机场,现在他们都要坐车离开机场.第\(i\)个乘客到达的时间是\(T_i\),一个乘客必须在\([T_i,T_i+k]\)时刻做到车,否则他会生气.一辆车最多可以坐\(C\)个人.问最少安排几辆车可以让所有人都不生气. 题解 从前往后贪心即可. #include<iostream

AtCoder Grand Contest 014

AtCoder Grand Contest 014 A - Cookie Exchanges 有三个人,分别有\(A,B,C\)块饼干,每次每个人都会把自己的饼干分成相等的两份然后给其他两个人.当其中有一个人的饼干数量是奇数的时候停止,求会进行几次这样子的操作,或者会永远进行下去. 首先无解的情况一定是三个数都是相等的偶数. 否则直接暴力模拟就行了.(盲猜答案不会很大) 证明一下答案的范围:不妨令\(A\le B\le C\),那么最大值和最小值之间的差就是\(C-A\),那么执行完一次操作之后

【Atcoder Grand Contest 020 E】 Encoding Subsets

Atcoder Grand Contest 020 E 题意:给一个\(0-1\)字符串,如果其中有一段重复,就可以表示成\((\)这一块的表示\(\times\)出现次数\()\). 问这个字符串的所有子集中有多少种表示方法. 思路:考虑\(dp(s)\)表示字符串\(s\)的答案. 那么我们得考虑第一个表示成的位置是什么. ①第一位就是表示的第一位,不参与循环.那么转移到\(dp(s.substr(1))\),并且如果这位是\(1\),那么乘上\(2\),因为这位可能是\(0\). ②一个前

AtCoder Grand Contest 016

AtCoder Grand Contest 016 A - Shrinking 你可以进行一个串的变换,把一个长度为\(n\)的串\(S\)可以变成长度为\(n-1\)的串\(T\),其中\(T_i\)要么是\(S_i\)要么是\(S_{i+1}\). 现在问你最少进行多少次这个操作,能够使最终得到的\(T\)只由一个字符构成. \(|S|\le 100\) 首先枚举最终字符是哪一个.那么首先在\(S\)末尾加上一个这个字符,那么这个最小步数等于对于所有位置而言,离它最近的枚举的字符到这个位置的

Atcoder Grand Contest 018 E - Sightseeing Plan

Atcoder Grand Contest 018 E - Sightseeing Plan 枚举从第二个矩形的 \((x_1,y_1)\) 进入,\((x_2,y_2)\) 出来,那么中间可以选的点的数量是 \(x_2+y_2-x_1-x_2+1\) ,也就是说对于每一条合法路线,从 \((x_1,y_1)\) 进入的贡献为 \(-x_1-x_2\) ,从 \((x_2,y_2)\) 出来的贡献为 \(x_2+y_2+1\) ,枚举一下第二个矩形边界上的点,我们只需要分别计算某个点到第一个矩形

AtCoder Grand Contest 002 (AGC002) F - Leftmost Ball 动态规划 排列组合

原文链接https://www.cnblogs.com/zhouzhendong/p/AGC002F.html 题目传送门 - AGC002F 题意 给定 $n,k$ ,表示有 $n\times k$ 个球,其中,颜色为 $1,2,\cdots, n$ 的球各有 $k$ 个. 将这些球任意排列成一排,对于每一种颜色,将这种颜色的球的最左边的那个涂成颜色 $0$ . 问最终可以得到多少种不同的排列. $1\leq n,k\leq 2000,{\rm Mod} = 10^9 +7$ 题解 首先当 $

AtCoder Grand Contest 020 (AGC020) E - Encoding Subsets 动态规划

原文链接www.cnblogs.com/zhouzhendong/p/AGC020E.html 前言 真 \(\cdot\) 信仰型动态规划 题解 我们可以采用信仰型动态规划解决此题. 设 \(dp[S]\) 表示 S 这个字符串的所有子集可以被编码成多少种. 那么分两种情况转移: 不编码,答案是子集总数. 考虑枚举最左边的一处编码,递归DP. 时间复杂度 \(O(信仰)\) . 时间复杂度证明?详见官方题解.反正我没去看. 代码 #include <bits/stdc++.h> #defin