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 = ;
const int INF = 0x3f3f3f; int main()
{
//freopen("E:\\acm\\input.txt","r",stdin);
int T;
cin>>T;
for(int t=;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+,s2+);
int Len1 = strlen(s1+), Len2 = strlen(s2+); for(int i=;i<=Len1;i++) dp1[i][] = i, dp2[i][] = ;
for(int i=;i<=Len2;i++) dp1[][i] = i, dp2[][i] = ; for(int i=;i<=Len1;i++)
for(int j=;j<=Len2;j++){
if(s1[i] == s2[j]){
dp1[i][j] = dp1[i-][j-] + ;
dp2[i][j] = dp2[i-][j-]; //这个时候直接把s1[i](s2[j])放在合成串s后面,所以加一;
}
else{
if(dp1[i-][j] == dp1[i][j-]){
dp1[i][j] = dp1[i-][j] + ;
dp2[i][j] = dp2[i-][j] + dp2[i][j-]; /**这个地方最难理解,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-][j] > dp1[i][j-]){ //1.说明s1[i]能与s2[j-1]或者j-1之前某个组合在一起,而s2[j]不能。
dp1[i][j] = dp1[i][j-] + ; //取小的; 并添加了一个字母s2[j];
dp2[i][j] = dp2[i][j-]; //由1.这句知道:s2[j]只能添加在合成串s的最后。
}
else{ //此处分析同上。
dp1[i][j] = dp1[i-][j] + ; //取小的; 并添加了一个字母s1[i];
dp2[i][j] = dp2[i-][j];
}
}
}
printf("Case %d: %lld %lld\n",t,dp1[Len1][Len2],dp2[Len1][Len2]);
}
}
//总结下,这个dp1其实就是简单的LCS的变形,而dp2就是关键,这是参考别人的方法,只是觉得很精妙就学习下。
lightoj 1013 dp的更多相关文章
- (最长公共子序列+推导)Love Calculator (lightOJ 1013)
http://www.lightoj.com/volume_showproblem.php?problem=1013 Yes, you are developing a 'Love calcula ...
- lightoj 1036 dp
题目链接:http://lightoj.com/volume_showproblem.php?problem=1036 #include <cstdio> #include <cst ...
- lightoj 1018 dp
题目链接:http://lightoj.com/volume_showproblem.php?problem=1018 #include <cstdio> #include <cst ...
- lightoj 1004 dp:数字三角形
题目链接:http://lightoj.com/volume_showproblem.php?problem=1004 #include <cstdio> #include <cst ...
- lightoj 1013
思路:动态规划.设dp[i][j][k]表示用第一个串的前i隔字符和第二个串的前k隔字符组成长度为i的串的个数,那么:若s1[j+1] == s2[k+1] dp[i+1][j+1][k+1] += ...
- LightOJ 1013 - Love Calculator LCS
题意:找一个串使给出的两个串都是它的子串,要求最短,求出最短长度,以及种类数. 思路:可以想到,当两个子串a,b拥有最长的公共子串为LCS时,那么可以求出的最短的串为lena+lenb-LCS. 那么 ...
- LightOJ 1017 - Brush (III) 记忆化搜索+细节
http://www.lightoj.com/volume_showproblem.php?problem=1017 题意:给出刷子的宽和最多横扫次数,问被扫除最多的点是多少个. 思路:状态设计DP[ ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- LightOj 1298 - One Theorem, One Year(DP + 欧拉)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...
随机推荐
- MongoDB_1
突然想去看下MongoDB的东西,于是有了这篇文章.其实很早以前就看过一些关于NoSql的文章,还记得当时里面有介绍MongoDB的,多瞅了2眼,并且在Window下安装了MongoDB的驱动,小玩了 ...
- Gridview分頁保存選項
#region //'Revision: 1.00 Created Date: 2013/08/02 Created ID: Una [#1300071]增加多選框 /// <summary&g ...
- CI 笔记4 (easyui 手风琴)
添加父div标签,和子div标签 <div class="easyui-accordion" data-options="fit:true,border:false ...
- Linux 删除文件夹
inux删除目录很简单,很多人还是习惯用rmdir 1.直接rm就可以了:rm -rf 目录名字 -r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思
- 赋值,copy和deepcopy
python的复制,拷贝,和深拷贝. >>> a=[23,3]>>> b=a>>> b.append(234)>>> a[23, ...
- ThinkPHP接入支付宝支付功能
最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能.这里我用的是即时到帐的接口,具体实现的步骤如下: 一.下载支付宝接口包 下载地址:https://b.alipay.com/o ...
- 实用的透明背景mark图标
- nginx 要改进的地方基础
- spoj 2319 BIGSEQ - Sequence
You are given the sequence of all K-digit binary numbers: 0, 1,..., 2K-1. You need to fully partitio ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...