计蒜客 17412 Card Hand Sorting 最长公共子序列

Posted Flowersea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜客 17412 Card Hand Sorting 最长公共子序列相关的知识,希望对你有一定的参考价值。

链接:

https://nanti.jisuanke.com/t/17412

题意:

给你n张扑克,问你最少移动多少次使得排列好

排列好是指同种花色在一起,并且递增或者递减

题解:

生成所有排列好的数列,然后求lcs

代码:

31 int n;
32 int p[MAXN];
33 int dp[MAXN][MAXN];
34 VI v[4];
35 
36 int main() {
37     ios::sync_with_stdio(false), cin.tie(0);
38     cin >> n;
39     rep(i, 0, n) {
40         string s;
41         cin >> s;
42         int a, b;
43         if (s[0] == T) a = 10;
44         else if (s[0] == J) a = 11;
45         else if (s[0] == Q) a = 12;
46         else if (s[0] == K) a = 13;
47         else if (s[0] == A) a = 14;
48         else a = s[0] - 0;
49 
50         if (s[1] == s) b = 0;
51         else if (s[1] == h) b = 1;
52         else if (s[1] == d) b = 2;
53         else b = 3;
54 
55         int c = a + b * 13;
56         p[i] = c;
57         v[b].pb(c);
58     }
59     rep(i, 0, 4) sort(all(v[i]));
60     int a[4] = { 0,1,2,3 };
61     int ans = INF;
62     do {
63         rep(i, 0, 1 << 4) {
64             VI vec;
65             rep(j, 0, 4) {
66                 VI t = v[a[j]];
67                 if ((i >> j) & 1) reverse(all(t));
68                 rep(i, 0, t.size()) vec.pb(t[i]);
69             }
70             memset(dp, 0, sizeof(dp));
71             rep(i, 1, n + 1) rep(j, 1, n + 1) {
72                 if (p[i - 1] == vec[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
73                 else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
74             }
75             ans = min(ans, n - dp[n][n]);
76         }
77     } while (next_permutation(a, a + 4));
78     cout << ans << endl;
79     return 0;
80 }

 

以上是关于计蒜客 17412 Card Hand Sorting 最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章

计蒜客:求平均年龄Python方法

计蒜客:求平均年龄Python方法

计蒜客 跳跃游戏(贪心)

Week13 实验总结

Week13 实验总结

计蒜客练习题:质数原根