首页 > 其他分享 >P3989 [SHOI2013] 阶乘字符串

P3989 [SHOI2013] 阶乘字符串

时间:2023-10-27 09:12:12浏览次数:33  
标签:P3989 max 字母 leq 阶乘 dp SHOI2013

P3989

bzoj #4416

  • 先考虑部分分,看到 \(n \leq 20\) 容易想到这个部分可以用状压
  • 起初可以设 \(dp_{S,i}\) 表示在前 \(i\) 个数中选出集合 \(S\) 中的字母是否可行,转移即枚举下一个字母是什么
  • 这个 dp 有一个很显然的性质:他肯定是前缀一段 \(0\) ,后缀一段 \(1\) 。我们不妨优化一下:设 \(dp_S\) 表示选完集合 \(S\) 中的数的所有情况中距离最远的情况能选择的最近下标是什么。
  • 转移即记录 \(nxt_{i,j}\) 表示从 \(i\) 开始往后选第 \(j\) 个字母的最近距离,可以知道 \(dp_{S} = \max\limits_{x \notin S} \{ nxt_{dp_{S-x}+1,x} \}\)
  • 最终答案即为 \([dp_{2^m-1} \leq n]\)
  • 然后 \(n \leq 26\) 呢?我们发现比较优秀的构造方案是 \(abcdcbabcd \cdots\) 这样,他的长度下界应该是 \(n^2-n+1\) 的。我们发现当 \(n=22\) 时, \(n^2-n+1=463>450\) ,因此我们在 \(n \geq 22\) 时输出 NO 即可
  • 最终复杂度 \(O(T|S|2^{\max(n,\omega)})\) ,其中 \(\omega=21\)

标签:P3989,max,字母,leq,阶乘,dp,SHOI2013
From: https://www.cnblogs.com/fox-konata/p/17790998.html

相关文章

  • C语言阶乘for循环语句的使用
    #include<stdio.h>intmain(){inti=0,n=0;ret=1;scanf_s("%d",&n);//scanf_s作用是避免在编译器中出现不安全影响代码编译 for(i=1;i<=n;i++)   { ret=ret*i;    } printf("%d\n",ret); return0;}用于输入n的阶乘利用for语句解决求1~10阶乘的......
  • C语言求1~n的阶乘的和的进阶优化
    #include<stdio.h>intmain(){ intret=1; intsum=0; intn=0;for(n=1;n<=10;n++)//10可以变成任意值 { ret=ret*n; sum=sum+ret; } printf("%d",sum); return0;}......
  • 阶乘幂
    下降阶乘幂:\(x^{\underline{m}}\),读作“\(x\)直降\(m\)次”。\(x^{\underline{m}}=x(x-1)(x-2)...(x-m+1)\),(\(m≥0\))\(x^{\underline{0}}=1\)所以\(A_n^m=n^{\underline{m}}\)上升阶乘幂:\(x^{\overline{m}}\),读作“\(x\)直升\(m\)次”。\(x^{\overline{m}}......
  • 前端歌谣的刷题之路-第二十四题-阶乘
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目请......
  • 前端歌谣的刷题之路-第二十四题-阶乘
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • python递归求阶乘和
    一些基本概念介绍:阶乘:是指从1到n的连续自然数相乘的积。负数没有阶乘。递归:函数作为一种代码封装,除了被其他程序正常调用外,还可以被函数内部代码调用。函数定义中调用函数自身的方式称为递归。递归实现的两个关键点:(1)存在一个或多个基例,基例不需要再次递归,它是确定的表达式。否则......
  • P1009 [NOIP1998 普及组] 阶乘之和
    题目描述用高精度计算出 S=1!+2!+3!+\cdots+n!S=1!+2!+3!+⋯+n!(n\le50n≤50)。其中 ! 表示阶乘,定义为 n!=n\times(n-1)\times(n-2)\times\cdots\times1n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5\times4\times3\times2\times1=1205!=5×4×3×2×1=......
  • 编写求阶乘函数
    ​ ,计算并返回1!+2!+3!+……+n!的值。函数fact()实现计算并返回123*……*n的值;函数fun()实现计算并返回1!+2!+3!+……+n!的值;函数main()从后台获取整数n,调用函数fun(),输出结果并保留0位小数。#include<stdio.h>floatfact(floatm){floati,s=1;for(i=1;i<=m......
  • C语言 计算一个数的阶乘两种方法
    //ConsoleApplication15.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<stdio.h>usingnamespacestd;longfact(intn);//使用循环方法longrfact(intn);//使用递归方法intmain(void){  intnum;  printf("Thisprog......
  • 西农OJ P1073 阶乘TvT
    1073:阶乘题目描述给一个整数,请输出该数字阶乘的后缀0的个数,例如:数字7,它的阶乘为5040,后面有一个0,则输出1;还有数字10,它的阶乘为3628800,后面有两个0,则输出2。输入第一行一个数据N,小于100,表示一共要输入n个数字,以后n行输入一个数字。输出对应于每一个输入,输出一个满足题目要......