• DP总结-壹-最长公共型


    题目列表

    • P1051 最长公共子序列
    • P1052 最长公共字串
    • P3636 三个序列的最长公共子序列

    思路 

    f[i][j]表示一号序列的第 i 位和二号序列的第 j 位

    把两个字序列/字串一位一位去比较,若出现相同的一位则 f[i][j]在f[i-1][j-1] 的基础上长度+1,否则取前面长度的最大值,长度不变;

    题目

    P1051 最长公共子序列

    模板题,很简单;

    1. #include
    2. using namespace std;
    3. int n,m;
    4. int a[505],b[505];
    5. int f[505][505];
    6. int main(){
    7. cin>>n>>m;
    8. for(int i=1;i<=n;i++){
    9. cin>>a[i];
    10. }
    11. for(int i=1;i<=m;i++){
    12. cin>>b[i];
    13. }
    14. for(int i=1;i<=n;i++){
    15. for(int j=1;j<=m;j++){
    16. if(a[i]==b[j]){
    17. f[i][j]=f[i-1][j-1]+1;
    18. }else{
    19. f[i][j]=max(f[i-1][j],f[i][j-1]);
    20. }
    21. }
    22. }
    23. cout<
    24. return 0;
    25. }

    P1052 最长公共字串

    注意字串要求连续,所以f[i][j]在 a串与b串不连续时取0这个值,ans为f数组中的最大值;

    1. #include
    2. using namespace std;
    3. int n,m,ans=0;
    4. int a[505],b[505];
    5. int f[505][505];
    6. int main(){
    7. cin>>n>>m;
    8. for(int i=1;i<=n;i++){
    9. cin>>a[i];
    10. }
    11. for(int i=1;i<=m;i++){
    12. cin>>b[i];
    13. }
    14. for(int i=1;i<=n;i++){
    15. for(int j=1;j<=m;j++){
    16. f[i][j]=0;
    17. if(a[i]==b[j]){
    18. f[i][j]=f[i-1][j-1]+1;
    19. }
    20. ans=max(ans,f[i][j]);
    21. }
    22. }
    23. cout<
    24. return 0;
    25. }

     P3636 三个序列的最长公共子序列

    直接开个三维数组,按照模板扩充出第三位的判断即可;

    1. #include
    2. using namespace std;
    3. int x,y,z;
    4. int a[505],b[505],c[205];
    5. int f[205][205][205];
    6. int main(){
    7. cin>>x>>y>>z;
    8. for(int i=1;i<=x;i++){
    9. cin>>a[i];
    10. }
    11. for(int i=1;i<=y;i++){
    12. cin>>b[i];
    13. }
    14. for(int i=1;i<=z;i++){
    15. cin>>c[i];
    16. }
    17. for(int i=1;i<=x;i++){
    18. for(int j=1;j<=y;j++){
    19. for(int k=1;k<=z;k++){
    20. f[i][j][k]=0;
    21. if(a[i]==b[j]&&b[j]==c[k]){
    22. f[i][j][k]=f[i-1][j-1][k-1]+1;
    23. }else{
    24. f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k]);
    25. f[i][j][k]=max(f[i][j][k],f[i][j][k-1]);
    26. }
    27. }
    28. }
    29. }
    30. cout<
    31. return 0;
    32. }

     看到这里了,给个三连不过分吧;

  • 相关阅读:
    request对象对请求体,请求头参数的解析
    分布式websocket搭建方案
    【UML分析、建模与设计】我在工作时遇到UML
    前后端验证码交互完整流程
    C#中解决PC端程序多开的问题
    Java-枚举
    为什么说Redis是单线程的以及Redis为什么这么快!
    js进阶笔记之原型,原型链
    【Redis】基于Spring Cache + Redis + Jackson的注解式自动缓存方案保姆式教程(2022最新)
    怎么压缩ppt大小?快速压缩ppt文件
  • 原文地址:https://blog.csdn.net/Kochakin/article/details/126202338