hdu 5576 dp
题目大意:给你一个长度为 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的更多相关文章
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 5928 DP 凸包graham
给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...
- HDU 1069 dp最长递增子序列
B - Monkey and Banana Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- HDU 1160 DP最长子序列
G - FatMouse's Speed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- hdu 4826(dp + 记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4826 思路:dp[x][y][d]表示从方向到达点(x,y)所能得到的最大值,然后就是记忆化了. #i ...
- HDU 2861 (DP+打表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2861 题目大意:n个位置,m个人,分成k段,统计分法.S(n)=∑nk=0CknFibonacci(k ...
- HDU 2838 (DP+树状数组维护带权排序)
Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...
- hdu 5791 (DP) Two
hdu 5791 Two Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- HDU 1069&&HDU 1087 (DP 最长序列之和)
H - Super Jumping! Jumping! Jumping! Time Limit:1000MS Memory Limit:32768KB 64bit IO Format: ...
随机推荐
- Android提示框与通知的使用
1.通知 Android 3.0以前使用的方法 NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION ...
- JavaScript知识之判断字符串中出现最多的字符及次数
var str = 'asdddasdfdseeeeeweeeeeeeeeeeee'; var json = {}; // 定义json一个对象 for(var i = 0; i < str.l ...
- android之解析json数据格式详解
1.JSON解析 (1).解析Object之一: view sourceprint? 1 {"url":"http://www.cnblogs.com/qianx ...
- 51Nod 1082 | 模拟
Input示例 5 4 5 6 7 8 Output示例 30 55 91 91 155 模拟 #include "bits/stdc++.h" using namespace s ...
- PHP扩展--APC缓存安装与使用
apc安装 wget http://pecl.php.net/get/APC-3.1.13.tgz tar zxvf APC-3.1.13.tgz cd APC-3.1.13 /usr/local/p ...
- Chrome切换分辨率
不知道大家是否有遇到在Web开发的时候,老大会让你模拟不同分辨率情况,这时候,可能就有些小小的麻烦,我们可能要不断调整分辨率.是件很崩溃的事情.现在推荐一款Chrome插件.即可实现这个简单的功能. ...
- mysql 替换
最近贷后好烦,经常让我修改短信模板内容,以前一两个模板手动就直接改了.随着短信模板的增多,手动一个个改内容就不行了. 今天又让我把短信模板中所有的的电话号码修改一下:如:010-44444444改为0 ...
- MVP应用在android app上
使用MVP模式来解耦activity中业务代码和界面代码.在activity中,将其中的业务抽象到presenter层:将其中的界面代码抽象到View层. MVP模式: 一个软件被划分成三层,View ...
- Html5学习3(拖放、Video(视频)、Input类型(color、datetime、email、month 、number 、range 、search、Tel、time、url、week ))
1.Html拖放 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> < ...
- UIDatePicker---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址: iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 UIDatePicker //转载请注明出处--本文永久链接:http://www ...