zoukankan      html  css  js  c++  java
  • 「考试」省选23

    好难啊。。。

    T1
    代码不打算写了。
    连续期望真的恶心死了。

    T2
    总之是一个矩阵乘法来优化(dp)的过程。
    然后矩阵和逆矩阵长得特别好看,可以优化维护。
    这样复杂度就被优化下来了。

    T3
    讲了一次了,不过似乎大家都没有听懂。
    详细的复读一次。
    这个题是构造题。
    首先题意转化。
    我们发现一个(E)的序列的形成过程中任意时刻的图都可以对应为一个大小为(i)大强连通分量和(n-i)个单独的点的形式。
    因为只有一个强连通所能到达的状态是最多的,这样我们求出这种图的方案就是(E)序列的方案。
    然后设(dp[e][i])为大强联通有(i)个点,总共有(e)条边的方案数。
    转移很简单,枚举一个新圈即可:

    [dp[e][i]=dp[e-1][i]+sumlimits_{j=0}^{i-1}dp[e-1][j] ]

    关键是要判断这个状态是否合法。
    怎么判断?
    发现状态里面没有记录边数。
    只需要判断边数是否合法即可。
    设当前状态的图中最少和最多的边数分别为:(L_i,R_i)
    合法的判断就是:(ein[L_i,R_i])
    (R_i)很好求。
    分别考虑大强连通内部形成完全图+其余点形成满边(DAG)+强连通内部和外部连边,这样构造出的边数一定最多。
    那么:

    [R_i=i(i-1)+sumlimits_{j=1}^{n-i}(j-1)+i(n-i)=i(i-1)+(n-i)(n-i-1)/2+i(n-i) ]

    但是发现(L_i)不是很好求。
    关键在于大强联通套了几个圈上去我们无法计数。
    所以给(dp)加一维:
    (dp[e][i][j])表示图中总共有(e)条边,大强连通分量中有(i)个点,(j)层圈的方案数。
    这样我们就可以求出(L_{ij})了。

    [L_{ij}=i+j-1 ]

    这个是怎么构造的呢?
    我们考虑让每条边的价值应用到最大。
    那么最优决策的一种一定是:让(i-j)个点作为基础,剩下(j)个分别作为新缩进去的的(j)层。
    这样的话边数最少就是:(L_{ij}=(i-j-1)+2j=i+j-1)
    这样就可以清楚判断条件了。
    其中(R_{ij}=R_i)
    那么紧接着再次考虑转移:

    [dp[e][i][j]=dp[e-1][i][j]+sumlimits_{k=0}^{i-1}dp[e-1][k][j-1] ]

    这样表示新枚举一个圈进去。
    那么设:

    [g[e][i][j]=sumlimits_{k=0}^{i}dp[e][k][j] ]

    得到:

    [dp[e][i][j]=dp[e-1][i][j]+g[e-1][i-1][j-1] ]

    这是一个前缀和优化。
    复杂度就正确了,是:(O(n^4))

  • 相关阅读:
    四则运算---3
    四则运算---2
    四则运算---1
    我的软工实践总结
    用例图练习..................................................
    第四次作业——个人作业——软件案例分析
    第三次作业——将排课Excel导入系统
    第二次作业——结对项目之需求分析与原型模型设计
    软工实践练习一(个人)----将Androidstudio的项目共享到github
    第一次作业---安卓开发工具Android studio发展演变
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12298908.html
Copyright © 2011-2022 走看看