Jzoj5424 凤凰院凶真
来源:互联网 发布:selenium js click 编辑:程序博客网 时间:2024/06/08 08:37
给你两个序列A和B,求出他们的最长公共上升子序列并输出方案
动态规划,我们假设f[i][j]表示A处理到第i位,B处理到第j位时的长度
那么显然,若A[i]=B[j],那么f[i][j]=max{f[i-1][k]}+1,否则f[i][j]=f[i-1][j]
我们再记一个g[i][j]表示f[i][j]是从哪里转移过来的,记上面那个k即可
到时候直接倒序递归按照g[i][j]输出,若g[i][j]=0那么就--i
#pragma GCC optimize("O3")#pragma G++ optimize("O3")#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int f[5010][5010],g[5010][5010],a[5010],b[5010],n,m;void print(int i,int j){if(j){while(i&&!g[i][j]) i--;print(i-1,g[i][j]);printf("%d ",b[j]);}}int main(){freopen("okarin.in","r",stdin);freopen("okarin.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;++i) scanf("%d",a+i);scanf("%d",&m);for(int i=1;i<=m;++i) scanf("%d",b+i);for(int k,i=1;i<=n;++i){k=0;for(int j=1;j<=m;++j){f[i][j]=f[i-1][j];if(a[i]==b[j]){f[i][j]=f[i-1][k]+1;g[i][j]=k;}if(a[i]>b[j]&&f[i-1][k]<f[i-1][j]) k=j;}}int j=0;for(int i=m;i;--i)if(f[n][i]>f[n][j]) j=i;printf("%d\n",f[n][j]);print(n,j);}
阅读全文
0 0
- Jzoj5424 凤凰院凶真
- [JZOJ5424]【NOIP2017提高A组集训10.25】凤凰院凶真
- 【JZOJ5424】【NOIP2017提高A组集训10.25】凤凰院凶真
- JZOJ5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
- jzoj5424【NOIP2017提高A组集训10.25】凤凰院凶真
- 凤凰
- 【NOIP2017提高A组集训10.25】凤凰院凶真(dp)
- 【JZOJ 5424】【NOIP2017提高A组集训10.25】凤凰院凶真
- JZOJ 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
- JZOJ 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
- 凤凰涅磐
- 凤凰旅游
- 凤凰涅槃
- 凤凰涅磐
- 凤凰传说
- 凤凰涅磐
- 凤凰花开
- 凤凰攻略
- 新手突然想到双11要脱单
- jQuery让两个select 互相换值
- Asp.net mvc4 WebApi 中使用多个Post请求,无法识别的问题
- anaconda+pytorch安装(无GPU版本)
- mips-simulator
- Jzoj5424 凤凰院凶真
- List / Map / Collections方法
- POJ 2096 Collecting Bugs
- 关于桥接模式的理解
- JDK8源码阅读之File(一)
- Windows的CRT中的setlocale()
- 2017.11.07离线赛总结
- JVM之晚期(运行期)优化
- Android移动开发-Android屏幕手势检测的实现