[CSU 1818 Crusher's Code Submit]记忆化递推
来源:互联网 发布:索尼u盘数据恢复 编辑:程序博客网 时间:2024/05/16 19:52
[CSU 1818 Crusher’s Code Submit]记忆化递推
分类:递推
数学
1. 题目链接
[CSU 1818 Crusher’s Code Submit]
2. 题意描述
有两种随机排序的算法伪代码。现在给你一个长度为
3. 解题思路
首先,因为题目给定的状态转移是单向的,也就是说只可能交换两个逆序的元素,不存在状态之间的来回转移。
然后,可以列出状态转移的一个方程。
用
那么,
- 对于算法一:
dp[s]=∑状态i总状态数cnt[(dp[ti]+1)∗2n2]+[(dp[s]+1)∗n2−2∗cntn2] - 对于算法二:
dp[s]=∑状态i总状态数cnt[(dp[ti]+1)∗1n−1]+[(dp[s]+1)∗n−1−cntn−1]
然后,移项就可以得到状态转移方程了。
4. 实现代码
#include <bits/stdc++.h>using namespace std;typedef long long LL;typedef long double LB;typedef pair<int, int> PII;typedef pair<LL, LL> PLL;const int INF = 0x3f3f3f3f;const LL INFL = 0x3f3f3f3f3f3f3f3fLL;const LB eps = 1e-6;const int MAXN = 1e3 + 5;int T, N;unordered_map<int, LB> dp[2];unordered_map<int, bool> vis[2];int dst;int Hash(const vector<int>& x) { int ret = 0; for(int i = 0; i < N; ++i) { ret = ret * 8 + x[i]; } return ret;}LB dfs1(vector<int>& x) { int v = Hash(x); if(v == dst) return 0; if(vis[0][v]) return dp[0][v]; dp[0][v] = 0; int cnt = 0; for(int i = 0; i < N; ++i) { for(int j = i + 1; j < N; ++j) { if(x[i] <= x[j]) continue; cnt ++; swap(x[i], x[j]); dp[0][v] += (dfs1(x) + 1) * 2; swap(x[i], x[j]); } } dp[0][v] += N * N - 2 * cnt; dp[0][v] /= 2 * cnt; vis[0][v] = true; return dp[0][v];}LB dfs2(vector<int>& x) { int v = Hash(x); if(v == dst) return 0; if(vis[1][v]) return dp[1][v]; dp[1][v] = 0; int cnt = 0; for(int i = 0; i < N - 1; ++i) { int j = i + 1; if(x[i] <= x[j]) continue; cnt ++; swap(x[i], x[j]); dp[1][v] += (dfs2(x) + 1); swap(x[i], x[j]); } dp[1][v] += (N - 1 - cnt); dp[1][v] /= cnt; vis[1][v] = true; return dp[1][v];}int main() {#ifdef ___LOCAL_WONZY___ freopen("input.txt", "r", stdin);#endif // ___LOCAL_WONZY___ scanf("%d", &T); while(T --) { dp[0].clear(), dp[1].clear(); vis[0].clear(), vis[1].clear(); scanf("%d", &N); vector<int> a(N), f(N), b(N); for(int i = 0; i < N; ++i) scanf("%d", &a[i]), f[i] = a[i]; sort(f.begin(), f.end()); f.erase(unique(f.begin(), f.end()), f.end()); for(int i = 0; i < N; ++i) b[i] = a[i] = lower_bound(f.begin(), f.end(), a[i]) - f.begin(); sort(b.begin(), b.end()); dst = Hash(b); int v = Hash(a); dfs1(a), dfs2(a); printf("Monty %.6f Carlos %.6f\n", (double)dp[0][v], (double)dp[1][v]); } return 0;}
0 0
- [CSU 1818 Crusher's Code Submit]记忆化递推
- CSU-1818 Crusher’s Code(期望dp)
- [CSU 1817 Bones’s Battery Submit]Floyd+二分+思维
- <s:submit>注意
- Timo's mushrooms CSU
- CSU 1683 Cryptographer’s Conundru
- [CSU 2005 Nearest Maintenance Point Submit Page] Dijkstra
- csu 1106 最优对称路径 最短路+记忆化搜索.
- csu 1510 Happy Robot(字符串DP,记忆化搜索)
- csu 1106 最优对称路径(最短路+记忆化搜索)
- CSU oj 1322: ZZY‘s new company
- csu 1556: Jerry's trouble(快速幂)
- CSU - 1556 Jerry's trouble(快速幂)
- CSU - 1556 Jerry's trouble(快速幂取模)
- s 参数 快速 记忆法
- Python,Crusher,XAMPP,CGI
- 如何学习crusher语言
- The Hacker's Code
- 最简单的 RabbitMQ 监控方法
- Ptrace 详解
- sdutacm-数据结构实验之查找二:平衡二叉树
- JAVA语言程序设计(基础篇)第九章答案
- hdu 2503 a/b+c/d(基础数论)
- [CSU 1818 Crusher's Code Submit]记忆化递推
- 统计文件中字符串出现的频率
- 欢迎使用CSDN-markdown编辑器
- 微信公众平台测试账号 接口信息配置失败解决方法
- sdutacm-Fence Repair
- Lua 实验,数据类型相关
- 按PEP8风格自动排版Python代码
- 我的物联网综合知识之整体架构
- Zookeeper(四)Acl权限控制