POJ 1692 Crossed Matchings(DP)
来源:互联网 发布:新浪2017中超球员数据 编辑:程序博客网 时间:2024/04/20 22:04
题意:两个序列,要选出交叉线,使得线的两点数字要相同,并且两条线两边的数字不能相同,问最多能弄出几组
思路:类似LCM,dp[i][j]表示两个i, j的方案,然后如果a[i] != b[j], 那么从i和j分别往前找到一个相同dp[i][j] = dp[k1][k2] + 2,剩下的转移就是dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
代码:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 105;int t, n, m, a[N], b[N], dp[N][N];int main() { scanf("%d", &t); while (t--) {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);for (int i = 1; i <= m; i++) scanf("%d", &b[i]);memset(dp, 0, sizeof(dp));for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) {dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);if (a[i] == b[j]) continue;int k1, k2;for (k1 = i - 1; k1; k1--) if (a[k1] == b[j]) break;for (k2 = j - 1; k2; k2--) if (b[k2] == a[i]) break;if (k1 && k2) dp[i][j] = max(dp[i][j], dp[k1 - 1][k2 - 1] + 2); }}printf("%d\n", dp[n][m]); } return 0;}
0 0
- POJ 1692 Crossed Matchings(DP)
- POJ 1692 Crossed Matchings(dp).
- POJ 1692 Crossed Matchings(DP)
- POJ 1692 Crossed Matchings(DP)
- POJ 1692 Crossed Matchings(DP)
- poj 1692 Crossed Matchings DP
- poj 1692 Crossed Matchings(DP)
- POJ 1692 Crossed Matchings (DP) #by Plato
- POJ 1692 Crossed Matchings
- poj 1692 Crossed Matchings
- POJ 1692 Crossed Matchings
- POJ 1692 Crossed Matchings
- POJ1692 Crossed Matchings(dp)
- 【poj 1692】Crossed Matchings (最长公共子序列变形)
- ZOJ1425 Crossed Matchings dp
- Crossed Matchings zoj1425 dp
- POJ1692 Crossed Matchings DP
- poj 1692 Crossed Matchings 动态规划
- 星星图案1
- (一)Knockout - ViewModel 的使用
- 进程和线程的区别
- [ASP.NET MVC 5 - 04] 控制器与模型及视图的交互
- 如何实现ios屏幕的横竖屏自适应
- POJ 1692 Crossed Matchings(DP)
- 算法讲解—【4】—Fisher准则&感知准则&最小错误分样本数准则
- SGU 131 Hardwood floor(状压DP)
- 重读《现代编译原理》几句小感
- java.toString() ,(String),String.valueOf区别
- ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
- Storm原理与实现
- 关于wave file format
- PLSQL developer/Xshell/Flashfxp配置信息复制