当前位置: 首页 > news >正文

lightoj 1013 dp

题目链接:http://lightoj.com/volume_showproblem.php?problem=1013

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;

const int maxn = 35;
const int INF  = 0x3f3f3f;

int main()
{
    //freopen("E:\\acm\\input.txt","r",stdin);
    int T;
    cin>>T;
    for(int t=1;t<=T;t++){
        long long dp1[maxn][maxn],dp2[maxn][maxn];     /**  dp1[i][j] = (i+j) - num(s1中前i个和s2中前j个的最长公共子序列)。
                                                            dp2[i][j]是包含s1中前i个和s2中前j个字母的最短字符串的个数。
                                                       **/
        char s1[maxn],s2[maxn];
        scanf("%s %s",s1+1,s2+1);
        int Len1 = strlen(s1+1), Len2 = strlen(s2+1);

        for(int i=0;i<=Len1;i++)   dp1[i][0] = i, dp2[i][0] = 1;
        for(int i=0;i<=Len2;i++)   dp1[0][i] = i, dp2[0][i] = 1;

        for(int i=1;i<=Len1;i++)
           for(int j=1;j<=Len2;j++){
             if(s1[i] == s2[j]){
                   dp1[i][j] = dp1[i-1][j-1] + 1;
                   dp2[i][j] = dp2[i-1][j-1];  //这个时候直接把s1[i](s2[j])放在合成串s后面,所以加一;
                }
                  else{
                    if(dp1[i-1][j] == dp1[i][j-1]){
                        dp1[i][j] = dp1[i-1][j] + 1;
                        dp2[i][j] = dp2[i-1][j] + dp2[i][j-1];   /**这个地方最难理解,dp1[i-1][j] == dp1[i][j-1] 得出s1[i-1] != s2[j] ,s1[i] != s2[j-1].
                                                                    dp2[i-1][j] 可以理解为把s1[i]放在合成串s的最后的方法数,dp2[i][j-1]可以理解为把s2[j]放在合成串s最后的方法数。
                                                                    加起来就的到总共的组合数
                                                                 **/
                    }
                    else if(dp1[i-1][j] > dp1[i][j-1]){  //1.说明s1[i]能与s2[j-1]或者j-1之前某个组合在一起,而s2[j]不能。
                        dp1[i][j] = dp1[i][j-1] + 1;     //取小的; 并添加了一个字母s2[j];
                        dp2[i][j] = dp2[i][j-1];         //由1.这句知道:s2[j]只能添加在合成串s的最后。
                    }
                    else{                                //此处分析同上。
                        dp1[i][j] = dp1[i-1][j] + 1;     //取小的; 并添加了一个字母s1[i];
                        dp2[i][j] = dp2[i-1][j];
                    }
                }
        }
        printf("Case %d: %lld %lld\n",t,dp1[Len1][Len2],dp2[Len1][Len2]);
    }
}
//总结下,这个dp1其实就是简单的LCS的变形,而dp2就是关键,这是参考别人的方法,只是觉得很精妙就学习下。
View Code

 

转载于:https://www.cnblogs.com/acmdeweilai/p/3273453.html

相关文章:

  • php中curl和soap方式请求服务超时问题
  • 8月25日
  • 冒泡排序和选择排序流程图
  • 域帐号密码过期邮件提醒
  • 一个html,3D 标签 鼓励自己
  • 阿里云大数据MaxCompute基于UDTF解析JSON日志的案例
  • The connection to adb is down, and a severe error has occured. 错误
  • 一文带你了解 LSM Compaction
  • 里氏替换原则
  • UI设计不就是画线框,凭什么年薪30W?
  • 彻底解决乱码
  • 我的微软最有价值专家(Microsoft MVP)之路
  • 如何向Android模拟器打电话发短信
  • 【奥斯卡理财星体系 序篇】为什么你需要学习这个理财体系?
  • 基于阿里云快速搭建数字营销引擎【计算广告】
  • 分享的文章《人生如棋》
  • 【面试系列】之二:关于js原型
  • 07.Android之多媒体问题
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • JavaScript 基础知识 - 入门篇(一)
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue-cli在webpack的配置文件探究
  • windows下如何用phpstorm同步测试服务器
  • 工作手记之html2canvas使用概述
  • 设计模式 开闭原则
  • 什么软件可以剪辑音乐?
  • 原生js练习题---第五课
  • 你对linux中grep命令知道多少?
  • #、%和$符号在OGNL表达式中经常出现
  • #pragam once 和 #ifndef 预编译头
  • #QT(一种朴素的计算器实现方法)
  • $forceUpdate()函数
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)jdk与jre的区别
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *1 计算机基础和操作系统基础及几大协议
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .netcore如何运行环境安装到Linux服务器
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .net实现客户区延伸至至非客户区
  • ;号自动换行
  • @staticmethod和@classmethod的作用与区别
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决