zoukankan      html  css  js  c++  java
  • 20201007

    T1

    T2

    T3

    首先对于没有修改的情况,有一个显然的dp转移:

    if(!last[i]) dp[i] = dp[i - 1] * 2 + 1;
    if(last[i]) dp[i] = dp[i - 1] * 2 - dp[last[i] - 1];
    

    其中 dp[i]表示考虑前i位的方案数,last[i]表示最近的与a[i]相同的字符的位置,如果 a[i]第一次出现,则last[i]0.

    现在我们考虑矩阵。

    设状态矩阵(A),其中A[i][j]表示以i开头,在结尾预支一个j的方案数,其中i,j0时表示一个时空序列。

    对于一个数1的初始矩阵,对于对角线的元素,显然方案数为1,而对于第(1)行,显然都为1
    比如对于数字1的初始矩阵为 (egin{bmatrix} 1 0 0 0\ 1 1 1 1\ 0 0 1 0\ 0 0 0 1\ end{bmatrix})
    容易发现两个状态矩阵的合并就是矩阵乘法,即(C_{i,j}=sumlimits_{k=0}^3A_{i,k} imes B_{k,j})

    T4

  • 相关阅读:
    usaco-ariprog1-pass
    usaco-crypt1-pass
    usaco-barn-repair-pass-KISS
    usaco-mixing milk-pass
    面试HR
    LCS求最长公共子序列(DP)
    毕业随想(转载)
    0-1背包问题(DP)
    排序算法
    二叉搜索树的实现 java
  • 原文地址:https://www.cnblogs.com/scy-fisheep/p/13777359.html
Copyright © 2011-2022 走看看