动态规划交错匹配问题
来源:互联网 发布:java图形接口 编辑:程序博客网 时间:2024/05/22 10:30
题目
题目分析
对动态规划题目的理解不是特别深,所以看了别人的博客进行学习,给出博客地址交错匹配博客,说的非常好也非常详细,但是预处理写的不是很好,我用自己想到的思路写了出来,清晰明白一点。
#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[n][m]); } return 0;}
0 0
- 动态规划交错匹配问题
- 动态规划解决字符串交错组成问题
- 【动态规划】交错重排
- 动态规划-交错组成
- 交错字符串——动态规划
- 字符串交错组成(动态规划)
- 字符串的交错组成 动态规划
- 括号匹配问题(动态规划)
- 动态规划 括号匹配
- 文件名匹配-动态规划
- 立体匹配---动态规划
- 递归与动态规划---字符串的交错组成
- 动态规划——字符串的交错组成
- 带通配符的字符串匹配问题的动态规划算法
- 利用动态规划解决-字符串的匹配问题
- jzoj P1492 交错匹配
- SSL P2701 交错匹配
- 【动态规划】正则表达式匹配
- 生成网站快捷方式
- 解决Android studio 下的APK打包失败问题
- OC语言笔记(六):OC单例、NSData和文件操作
- 神奇的排序
- 阐述一下线程与进程的区别
- 动态规划交错匹配问题
- 网络层概念学习之一(基本概念、路由器、选路算法)
- Arm Inline hook的简易原理图
- ACE框架整合记录5tooltip插件-【完结】
- iOS设备唯一标识探讨
- java设计模式:代理模式
- Winform NetAdvantage的Summary相关功能(一)
- 新闻类list,支持两种不同的item
- cocos2dx3.x 导出自定义事件到lua的方法