zoukankan      html  css  js  c++  java
  • UVA11982题解

    UVA11982大概说了这么一个问题:告诉你当前排名是相对于上一次排名是上升了还是下降了还是没有变,求上一次排名共有多少个。

    首先我们根据数据范围确定这个计数的问题应该是使用一个O(N2)的算法来解决,由于这题是个计数类问题, 还有模1000000007的操作,初步断定是个动态规划。

    然后我就想了好长时间这题该怎么办…………

    最终思路整理如下:

    本次的位置作为一个点集S1, 上次可能位置作为一个点集S2,我们把所有可能的位置组合相连发现对于 S1 中的第 i 个点而言:如果 i 对应的字母是U, 则 i  应与 (i+1, n) 相连; 如果 i 对应的字母是D, 则 i 应与 (1, i-1)相连; 如果 i 对应字母为E, 则 i 应与 i 相连。

    接下来我们来设计状态。

    容易发现上面的关系图是一个二分图,而所求是该二分图完美匹配的个数。

    首先我们定义第一维状态是当前匹配到的点是谁。
    然后我们容易发现对于S1 集合的 i 和 S2 集合的 i , 当二分图处于完美匹配时, S2 中的 i 及 i 以上的点中会有几个点不与S1 中 i 点以上的点匹配。 把这些边去掉之后这几个点就成为了未匹配点。

    由此我们发现了子问题:i-1以上有j 个点未匹配时的总数。

    于是我们定义状态的第二维:S2中i点以上未匹配点有j个

    至此状态定义完毕。

    接下来开始考虑转移方程:

    当i对应字母为U时, dp[i][j] 可以由 dp[i-1][j-1] 转移而来, 也可以由dp[i-1][j]转移而来。因为此时i 与(i+1, n)相连, 所以S2中的i点一定会成为未匹配状态; 

    所以如果i-1位置以上有j-1个点未匹配, 则i位置以上有j 个点未匹配。

    另外一种情况是这样的:在i-1以上有j个点未匹配,我们考虑:

     1. 对于i-1以上字母为D的点而言, 匹配点一定在i-1以上

     2.    对于i-1以上字母为E的点而言, 匹配点一定在i-1以上

     3. 对于i-1以上字母为U的点而言, 匹配点可能在i-1以上,也可能在i-1以下

    前两种情况都不会影响结果,因为其决策都只有一种,主要是第三种情况。当i-1位置以上有j个点未匹配时,对应的也一定有j个点的匹配点在i-1以下。我们将这些边中任意一条边修改为匹配i对应的点就可以从dp[i-1][j] 转移到 dp[i][j]了。j条边一共有j种情况

    所以我们由此可知,当i对应的字母为U时, dp[i][j] = dp[i-1][j] * j + dp[i-1][j-1];

    应用同样的分析过程我们可以得知:

    当i对应的字母为D时,dp[i][j] = dp[i-1][j] * j + dp[i-1][j+1] * (j+1) * (j+1)

    当i对应的字母为E时,dp[i][j] = dp[i-1][j];

  • 相关阅读:
    for of 与 for in的区别
    Mac Item2 SSH免密登录Linux 服务器的两种方式
    组塞式,非阻塞式,同步异步
    Thrift_简介(基于C#)
    HTTP Error 500.22
    http协议
    IIS_部署出错
    JavaScript如何实现继承
    $(function(){})与 (function(){})() (function($){})() 的区别
    C#_反射机制
  • 原文地址:https://www.cnblogs.com/zzhzz/p/7684915.html
Copyright © 2011-2022 走看看