题目大意:
就是现在给出一个串, 只包含一个*号, 表示乘法, 剩下的是数字
于是对于这个乘法式子, 当*某一边没有数字的时候视为那一侧的数字是0
现在进行K次操作, 每次操作随机选择两个不同的位置交换
为最后表达式的值的期望, 乘上(C[n][2])^K的结果, n是串的长度, 结果对于10^9 + 7取模
大致思路:
这个可能的状态表示是从学长那边听到的...然后当了一下小白鼠推了一下...然后发现可以用前缀和优化复杂度说不定能过...然后居然真的AC了....
用dp[i][j][a][b]表示当前进行了i次变换, *在j位置, a位置乘上b位置的数(不看是什么位, 只看两个数字相乘的结果)的所有可能情况的和
处理前将*位置与其他数的乘积视为0
那么转移方程式可以分类讨论出来....这个递推式写在代码注释里了...
受到内存限制改了几次...不过递推式的原型也保留在代码里了
时间复杂度O(K*n^3)
不过这个代码交C++ TLE了... G++ 1.7sAC, 应该有更好的解法
代码如下:
Result : Accepted Memory : 36640 KB Time : 1747 ms
/*
* Author: Gatevin
* Created Time: 2015/11/28 19:01:07
* File Name: Yukinoshita_Yukino.cpp
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include