题目大意:给你一个长度为 n 的 字符串表示一个乘法,一次操作随机选两个字符进行交换,进行m次操作,让你求出所有可能操作

的答案和。  (1 <= n, m <= 50)

思路:巨难。。 对于固定位置的三个字符来说,把中间的看成*, 两边的为a,b, 这个产生的贡献为,a * b * C,C只与a, b和 * 的位置有关,

所以我们只要求出a*b的贡献就好啦。

我们定义dp[ a ][ b ][ c ][ k ] 表示三个字符分别是a,b,c, b在中间,还需要交换 k次的答案。

最后枚举三个位置求答案。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int>
#define y1 skldjfskldjg
#define y2 skldfjsklejg using namespace std; const int N = + ;
const int M = 1e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 +; char s[];
int n, m, a[], cnt[];
LL f[][][][], ten[]; void add(LL &a, LL b) {
a += b; if(a >= mod) a -= mod;
} LL dp(int a, int b, int c, int m) {
// printf("%d %d %d %d $$\n", a, b, c, m);
if(!m) return b == ? a * c : ;
if(a > c) swap(a, c);
LL &ans = f[a][b][c][m];
if(~ans) return ans;
ans = ; add(ans, dp(c, b, a, m - )); // a <-> c
add(ans, dp(b, a, c, m - )); // a <-> b
add(ans, dp(a, c, b, m - )); // b <-> c LL num = (n - ) * (n - ) / ; if(num) add(ans, num * dp(a, b, c, m - ) % mod); // a, b, c 之外的两个数相互交换 int t[];
memcpy(t, cnt, sizeof(t));
t[a]--; t[b]--; t[c]--;
for(int i = ; i <= ; i++) { // a, b, c 之外的一个数与 a 或 b 或 c 交换
if(!t[i]) continue;
add(ans, t[i] * dp(i, b, c, m - ) % mod); //挑一种数与a交换
add(ans, t[i] * dp(a, i, c, m - ) % mod); //挑一种数与b交换
add(ans, t[i] * dp(a, b, i, m - ) % mod); //挑一种数与c交换
} return ans;
} int main() { ten[] = ;
for(int i = ; i <= ; i++) ten[i] = ten[i - ] * % mod; int T; scanf("%d", &T); for(int cas = ; cas <= T; cas++) {
memset(f, -, sizeof(f));
memset(cnt, , sizeof(cnt));
scanf("%d%s", &m, s);
n = strlen(s);
printf("Case #%d: ", cas); for(int i = ; i < n; i++) {
a[i] = (s[i] == '*' ? : s[i] - '');
cnt[a[i]]++;
} LL ans = ; for(int i = ; i < n; i++) {
for(int j = i + ; j < n; j++) {
for(int k = j + ; k < n; k++) {
add(ans, ten[j - i - ] * ten[n - k - ] % mod * dp(a[i], a[j], a[k], m) % mod);
}
}
} printf("%lld\n", ans);
}
return ;
} /*
2
1
1*2
2
1*2
*/

hdu 5576 dp的更多相关文章

  1. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  2. HDU 5928 DP 凸包graham

    给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...

  3. HDU 1069 dp最长递增子序列

    B - Monkey and Banana Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  4. HDU 1160 DP最长子序列

    G - FatMouse's Speed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  5. hdu 4826(dp + 记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4826 思路:dp[x][y][d]表示从方向到达点(x,y)所能得到的最大值,然后就是记忆化了. #i ...

  6. HDU 2861 (DP+打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2861 题目大意:n个位置,m个人,分成k段,统计分法.S(n)=∑nk=0CknFibonacci(k ...

  7. HDU 2838 (DP+树状数组维护带权排序)

    Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...

  8. hdu 5791 (DP) Two

    hdu 5791 Two Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  9. HDU 1069&&HDU 1087 (DP 最长序列之和)

    H - Super Jumping! Jumping! Jumping! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

随机推荐

  1. 10.nginx+ffmpeg上搭建HLS切片

    1.首先介绍一下HLS协议: (1)简介 这个协议是由苹果公司提出并推广使用的,维基百科介绍如下: HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络 ...

  2. [USACO06NOV] Roadblocks

    https://www.luogu.org/problem/show?pid=2865 题目描述 Bessie has moved to a small farm and sometimes enjo ...

  3. 【设计模式】 模式PK:抽象工厂模式VS建造者模式

    1.概述 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可.而建造者模式则是要求按 ...

  4. OScached页面缓存知识总结一

    OSCache页面缓存 什么是OSCache? OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能.OSCache ...

  5. [cerc2012][Gym100624D]20181013

    题意:一个序列,如果存在一个连续子序列,满足该子序列中没有只存在一次的序列,则原序列为boring,否则non-boring 题解: 分治递归 对一个序列,如果找到了一个只出现一次的数位于a[x],则 ...

  6. 【HNOI】 小A的树 tree-dp

    [题目描述]给定一颗树,每个点有各自的权值,任意选取两个点,要求算出这两个点路径上所有点的and,or,xor的期望值. [数据范围]n<=10^5 首先期望可以转化为求树上所有点对的and,o ...

  7. cookie、session、localstorage

    最早的Cookies问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个cookies,太少了.优势就是大家都支持,而且支持得还蛮好.cookie的内容主要包括:名字,值,过期时间, ...

  8. python3中处理url异常

    import urllib.request import urllib.error url = 'http://c.telunyun.com/Chart/getJsonData?market=1' d ...

  9. C++学习之路(三):volatile关键字

    volatile是c++中的一个关键字.用volatile修饰的变量,具有三个性质:易变性 (一)易变性: 由于编译器对代码执行的优化,两条赋值语句,下一条语句可能会直接从上一条语句使用的寄存器中取得 ...

  10. python实战===老司机奇技淫巧系列之字符转换成图片

    先放两张效果图: