动态规划交错匹配问题
2016-05-16 15:26
477 查看
题目
题目分析
对动态规划题目的理解不是特别深,所以看了别人的博客进行学习,给出博客地址交错匹配博客,说的非常好也非常详细,但是预处理写的不是很好,我用自己想到的思路写了出来,清晰明白一点。#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 2005; int a[maxn],b[maxn]; int dp1[maxn][maxn],dp2[maxn][maxn],f[maxn][maxn]; void init(int n,int m) { memset(dp1, 0, sizeof(dp1)); memset(dp2, 0, sizeof(dp2)); for(int i = 1; i <= n; i++) //dp1存储a列前i个数和b列前j个元素中,最靠近j的位置且等于a[i]的元素位置 { for(int j = 2; j <= m; j++) { if(a[i] == b[j-1]) dp1[i][j] = j-1; else dp1[i][j] = dp1[i][j-1]; } } for(int j = 1; j <= m; j++) //dp2存储a列前i个数和b列前j个元素中,最靠近i的位置且等于b[j]的元素位置 { for(int i = 2; i <= n; i++) { if(b[j] == a[i-1]) dp2[i][j] = i-1; else dp2[i][j] = dp2[i-1][j]; } } } int main() { int n,m; while(scanf("%d%d", &n, &m) != EOF) { for(int i = 1; i <= n; i++) scanf("%d", &a[i]); for(int j = 1; j <= m; j++) scanf("%d", &b[j]); init(n, m); memset(f, 0, sizeof(f)); for(int i = 2; i <= n; i++) { for(int j = 2; j <= m; j++) { f[i][j] = f[i-1][j-1]; //i和j都不参加匹配 f[i][j] = max(f[i][j], f[i-1][j]); //i不参加匹配 f[i][j] = max(f[i][j], f[i][j-1]); //j不参加匹配 if(a[i] != b[j]) //前面有能匹配的数,同时找到的是离i,j最近的,因为这样一定是最优的 { int ip = dp2[i][j],jp = dp1[i][j]; if(ip && jp) f[i][j] = max(f[i][j], f[ip-1][jp-1] + 2); } } } printf("%d\n", f [m]); } return 0; }
相关文章推荐
- 理解JS中的prototype
- Haproxy+MYSQL 负载均衡 原创
- [转] 在React Native中使用ART
- 模仿系统自带的集拍照,录制视频,以及iphone6S以下的手机拍摄livephoto照片(livephoto),滑动可切换
- Goodix系列------input device的init
- Unity Asset Store资源下载路径 资源保存路径
- ios图片的压缩处理
- 神奇的排序
- 解决Android studio 下的APK打包失败问题
- oracle数据库兼容mysql的差异写法
- 【转载】Java中使用Jedis操作Redis
- LoadRunner监控远程机器Windows资源,提示“net use failed” 解决办法
- 慎用jQuery中的submit()方法
- ASP.NET组件System.Web.Optimization原理及缓存问题详解
- 排序——堆排序
- Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web mod
- loadrunner监控iis指标
- android的数据存储的方式
- OC语言笔记(五):OC封装和复合
- ACE框架整合记录4Dialog插件-【完结】