3072: [Pa2012]Two Cakes
来源:互联网 发布:linux性能分析工具 编辑:程序博客网 时间:2024/06/06 18:57
有dp[i][j]=min(d[i-1][j],d[i][j-1])+1 –> a[i]==b[j]
dp[i][j]=d[i-t+1][j-t+1]+t —> t为i,j向前最长的不同序列;
但真正需要记录的状态为O(n);
#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)using namespace std;const int N=1e6+7;void sc(int& x){ char c=getchar();x=0; for(;c>'9'||c<'0';c=getchar()); for(;c<='9' && c>='0';c=getchar())x=10*x+c-'0';}vector<int> dif[N<<1];int n,a[N],b[N],pos[N],dp[N];inline int find(int id, int x) { int l = 0, r = dif[id].size() - 1, res = -1; while(l <= r) { int mid = l + r >> 1; if(dif[id][mid] <= x) res = mid, l = mid + 1; else r = mid - 1; } return ~res ? dif[id][res] : 0;}inline int Dp(int x,int y){ if(!x||!y)return x+y; if(a[x]==b[y])return dp[x] ? dp[x] : (dp[x]=min(Dp(x-1,y),Dp(x,y-1))+1); int t=find(x-y+n,x); return t ? Dp(t,y-x+t)+x-t : max(x,y);}int main(){ sc(n);rep(i,1,n)sc(a[i]);rep(i,1,n)sc(b[i]),pos[b[i]]=i; rep(i,1,n)dif[i-pos[a[i]]+n].push_back(i); printf("%d\n",Dp(n,n));}
0 0
- 3072: [Pa2012]Two Cakes
- bzoj 3072 [Pa2012]Two Cakes dp
- 【BZOJ3072】[Pa2012]Two Cakes【DP】
- BZOJ 3072: [Pa2012]Two Cakes [dp][记忆化搜索]
- BZOJ 3072 Two Cakes
- [bzoj3072]Two Cakes
- ssoj2663 two cakes(动归)
- cakes
- [bzoj3498]Cakes
- 【PA2012】【BZOJ4289】Tax
- 【PA2012】【BZOJ3502】Tanie linie
- 4289: PA2012 Tax
- BZOJ3492: PA2012 Binary Dodgeball
- BZOJ 4289: PA2012 Tax
- 【PA2012】Tax (最短路)
- 4289: PA2012 Tax
- 【BZOJ】4289 PA2012 Tax
- BZOJ3502 PA2012 Tanie linie
- 网上的机器学习、深度学习资源分享
- 278. First Bad Version
- 洛谷 P1084 疫情控制
- 大数据相关
- FTP在电脑和安卓设备间的妙用!
- 3072: [Pa2012]Two Cakes
- DFS算法介绍
- Codeforces Round #367 (Div. 2) ABCDE 题解
- Java设计模式之-代理模式
- boost::thread编程-线程中断
- [POJ 1741] Tree (点分治)
- ACM图论算法—UNIX插头问题
- Android的数据存储方式(二)
- stdcall、cdecl、fastcall、thiscall、nakedcall以及pascal