[CODE【VS】]江哥的DP题b
来源:互联网 发布:php相似图片搜索 api 编辑:程序博客网 时间:2024/06/06 08:24
原题
江哥解题报告:
我们不妨按照江哥dalao的思路来写:
设f(i,j)表示A中枚举到了第i个,B中枚举到了第j个,则: - a[i]=b[j] f(i,j)=f(i-1,j-1)+1;//如果相等就可以增加一条线 - a[i]≠b[j] f(i,j)=max{f(i-1,j),f(i,j-1),f(a1,b1)};
a1,b1是要干什么呢?不妨看一看这张图
找到当前b[j]所对应的a中b[j]这个数的编号,记为a1
同理,找到当前a[i]在b中的a[i]这个数的编号,记为b1
所以如果他们满足上图所对应的可以交叉的规律,就状态转移一下,然后…
懂了吧!
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<algorithm>#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)using namespace std;const int Inf=1000000000+10;struct node{ int a,b;}a[100010];int f[1010][1010],flag[1010];int numbera[1010],numberb[1010];int main(){ file("b"); int i,j,k,n,m; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i].a); numbera[a[i].a]=i; } for(i=1;i<=n;i++){ scanf("%d",&a[i].b); numberb[a[i].b]=i; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(a[i].a==a[j].b) f[i][j]=f[i-1][j-1]+1; else{ f[i][j]=max(f[i-1][j],f[i][j-1]); int a1=numbera[a[j].b],b1=numberb[a[i].a]; if(a1<i && b1<j)f[i][j]=max(f[i][j],f[a1][b1]+2); } printf("%d\n",f[n][n]); return 0;}
阅读全文
0 0
- [CODE【VS】]江哥的DP题b
- [CODE【VS】]江哥的DP题a
- [CODE【VS】]江哥的DP题d
- code force 429B dp好题
- code【vs】1380 没有上司的舞会(树形dp)
- VS Code的快捷键
- 【CODE VS】P1695 windows 2013(DP)
- code vs 1029 遍历问题 区间dp
- code vs 1378 选课(树形DP)
- 假期 code[vs]3622 dp+单调队列
- code vs 1520 回文字符串 (dp)
- code vs 1711 棋盘分割 (dp)
- code vs 1315 摆花 (dp)
- code(vs) 1154 能量项链 (区间dp)
- code(vs)1010 过河卒 (棋盘dp)
- code(vs)1219 骑士游历 (棋盘dp)
- code(vs)1220 数字三角形(普通dp)
- 区间DP code[vs]1258 关路灯
- 剑指offer--输入一个链表,反转链表后,输出链表的所有元素。
- Data Structure-Diagram
- 带你走进javabean的世界之内省机制
- 10月5日 c语言简单数组 输入10个数 要求从小到大顺序排列
- Nginx下打开网页报403 Forbidden nginx/1.10.3 (Ubuntu)
- [CODE【VS】]江哥的DP题b
- Java多线程(PART II) CurrentThread()方法
- Evaluate Division
- [Linux操作系统]Linux操作系统的内存分布
- linux下配置redis后台启动
- 多线程常用方法(一)
- Java并发编程 06 闭锁、同步屏障、信号量详解
- 剑指Offer------把数组排成最小的数
- Caffe移植到windows