题目大意:给你一个长度为 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. ubuntu 服务器搭建汇总

    开启ssh 1.首先:终端安装开启ssh-server服务: sudo apt-get install openssh-server 2.然后确认sshserver是否启动了: ps-e | grep ...

  2. [解决] HiveServer2中使用jdbc访问hbase时导致ZooKeeper连接持续增加的解决

    最近在监控中发现HiveServer2连接到zookeeper里的连接持续上涨,很奇怪,虽然知道HiveServer2支持并发连接,使用ZooKeeper来管理Hive表的读写锁,但我们的环境并不需要 ...

  3. Activity及Intent

    1.Activity 在一个Android应用程序中,Activity是为用户操作而展示的可视化界面.比如你要打电话,这个时候的拨号界面就是一个Activity,你要发短信给你的女朋友,这个短信窗口就 ...

  4. [技巧篇]11.JavaScript原生态如何获取浏览器请求地址中的参数

    var getAccessParams = function(){ var i,ilen,strs,keyName,keyValue, params={}, path = window.locatio ...

  5. 深入探索C++对象模型(二)

    构造函数语义学(The Semantics of Constructors) Default Constructor的构造操作 对于class X,如果没有任何user-declared constr ...

  6. 2017-2018-2 20179207 《网络攻防技术》python简明教程(1-10)

    Python3简明教程(一) 开始python之旅 使用交互模式的 Python3解释器 简单使用 vim 编写 Python3 脚本 执行 Python3 脚本 Python3 代码风格建议 Pyt ...

  7. iOS tag的使用

    一.添加标记 (标记不能为0) UIButton *backBtn = [[UIButton alloc] initWithFrame:CGRectMake(,,,)]; backBtn.backgr ...

  8. [CodeChef - GERALD07 ] Chef and Graph Queries

    Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...

  9. 密码本(无bug版)

    main.cpp #include <stdio.h> #include <stdlib.h> #include "data.h" #include &qu ...

  10. Python 语言使用中遇到的问题汇总

    1.python中的传值和传引用 和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方式.实际上,这种方式相当于传值和传 ...