题目大意:给你一个长度为 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. Python os.walk文件遍历

    os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元tupple(dirpath, dirnames, filena ...

  2. [实战篇入门]02-POI简单创建Excel

    周日的小讲堂要讲到这里,趁中午时间写点东西,记录昨天晚上完成的东西,在这里只是简单的介绍如何创建对于样式问题,我不过多的说,因为之后的教程会使用模版方式搞定! 在学习这段代码的时候,希望各位访问Apa ...

  3. UVA 12716 GCD XOR

    https://vjudge.net/problem/UVA-12716 求有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b 结论:若gcd(a, ...

  4. wiki文档书写格式

    文档基本规范 标题 标题:标明需求的简短语句.或模块名称,目录是由标题生成,一份目录结构清晰的需求文档与标题的划分是密不可分. 正文 正文:有规范格式和生效标志的正式文本,正文包括 文字.表格.图片. ...

  5. Large Class--过大的类--要重构的信号

    如果想利用单个类做太多事情,其内往往就会出现太多实例变量.一旦如此,Duplicated Code也就接踵而至.     解决方法:     1.将类内彼此相关的变量,将它们放在一起.使用Extrac ...

  6. 【BZOJ】4530: [Bjoi2014]大融合

    [题意]给定n个点的树,从无到有加边,过程中动态询问当前图某条边两端连通点数的乘积,n<=10^5. [算法]线段树合并+并查集 (||LCT(LCT维护子树信息 LCT维护子树信息(+启发式合 ...

  7. Java连接Oracle数据库的三种连接方式

    背景: 这两天在学习Oracle数据库,这里就总结下自己上课所学的知识,同时记录下来,方便整理当天所学下的知识,也同时方便日后自己查询. SQL语句的话,这里我就不多讲了,感觉和其他的数据库(MySQ ...

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

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

  9. Xutils使用详解

    刚开始的时候,在 GitHub 上面出现了一款强大的开源框架叫 xUtils,里面包含了很多实用的android工具,并且支持大文件上传,更全面的 http 请求协议支持(10种谓词),拥有更加灵活的 ...

  10. Java多线程学习(四)等待/通知(wait/notify)机制

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79690279 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...