Codeforces 201D Brand New Problem [状压dp]
2018-03-10 12:16
232 查看
Description:
给出一个有n个字符串的匹配串,和m个有k个字符串的文本串,将匹配串进行全排列和文本串进行匹配,找到能全匹配成功的最小的逆序对数。
Solution:
比较显然的dpdp是dp[i][j]dp[i][j]状态为ii,匹配到jj的最小逆序对数,然而这样复杂度过高。考虑常用技巧更换状态,将逆序对计入状态。dp[i][j]dp[i][j]表示状态为ii,逆序对数为jj最短匹配距离,距离最短自然方案更优。转移则考虑下一个字符选什么,预处理每个位置下一个字符的位置即可。
给出一个有n个字符串的匹配串,和m个有k个字符串的文本串,将匹配串进行全排列和文本串进行匹配,找到能全匹配成功的最小的逆序对数。
Solution:
比较显然的dpdp是dp[i][j]dp[i][j]状态为ii,匹配到jj的最小逆序对数,然而这样复杂度过高。考虑常用技巧更换状态,将逆序对计入状态。dp[i][j]dp[i][j]表示状态为ii,逆序对数为jj最短匹配距离,距离最短自然方案更优。转移则考虑下一个字符选什么,预处理每个位置下一个字符的位置即可。
#include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <map> using namespace std; const int N = 5e5 + 5; map<string, int> mp; int n, _, ret = -1, pp, m; int dp[1 << 16][125], po[16], nxt [16], a ; char s[105]; int main() { scanf("%d", &n); for(int i = 0; i < n; ++i) { scanf("%s", s); mp[s] = i; } pp = n * (n - 1) / 2 + 1; scanf("%d", &_); for(int id = 1; id <= _; ++id) { scanf("%d", &m); memset(po, 0x3f3f, sizeof(po)); for(int i = 1; i <= m; ++i) { scanf("%s", s); a[i] = mp.count(s) ? mp[s] : -1; } for(int i = m; ~i; --i) { for(int j = 0; j < n; ++j) { nxt[i][j] = po[j]; } if(a[i] != -1) { po[a[i]] = i; } } memset(dp, 0x3f3f, sizeof(dp)); dp[0][0] = 0; for(int i = 0; i < 1 << n; ++i) { for(int j = 0; j <= n * (n - 1) / 2; ++j) { for(int k = 0; k < n; ++k) { if(!(i & (1 << k)) && dp[i][j] <= m) { int &p = dp[i ^ (1 << k)][j + __builtin_popcount(i >> k)]; p = min(p, nxt[dp[i][j]][k]); } } } } for(int i = pp - 1; ~i; --i) { if(dp[(1 << n) - 1][i] <= m) { ret = id; pp = i; } } } if(ret == -1) { puts("Brand new problem!"); } else { printf("%d\n[:", ret); for(int i = 1; i <= n * (n - 1) / 2 + 1 - pp; ++i) { printf("|"); } puts(":]"); } return 0; }
相关文章推荐
- [无向图简单环计数 状压DP] Codeforces 11D Beta Round #11 D. A Simple Task
- CodeForces 165E 【状压DP】
- Codeforces 580D Kefa and Dishes【状压dp】
- Codeforces 401D Roman and Numbers【状压dp】
- codeforces 895C Square Subsets 线性基 或 状压DP
- Codeforces 453B Little Pony and Harmony Chest 状压DP
- Codeforces 678E Another Sith Tournament(状压dp,概率dp)
- [状压DP || 容斥 矩阵树定理] Codeforces 53E. Dead Ends
- CodeForces 895 C.Square Subsets(状压DP+线性基)
- Codeforces 201D.Brand New Problem-状压dp
- CodeForces - 482C Game with Strings(状压DP,期望)
- cf CodeForces - 165E 【状压dp】
- Codeforces 429C Guess the Tree(状压DP+贪心)
- codeforces 580D - Kefa and Dishes 状压dp - TSP
- CodeForces 21D Traveling Graph 状压dp+欧拉回路
- CodeForces - 11D 【状压DP+无向图找环】
- Codeforces 16E Fish (状压dp+概率)
- CodeForces 599E Sandy and Nuts 状压DP
- Codeforces 31E TV Game 中途相遇法 状压dp
- Codeforces 793C Mice Problem 几何(模拟)