hdu 5791 思维dp
题目描述:
求序列A,B的公共子序列个数;
基本思路:
想到了dp,选的状态也对,但是就是就是写不出状态转移方程,然后他们都出了,到最后我还是没出,很难受,然后主要是没有仔细考虑dp【i】【j】,dp【i】【j-1】,dp【i-1】【j】,dp【i-1】【j-1】在A【
i】和B【i】在相同和不相同是的数量关系,我为啥就没想到要减呢,只想着怎么把他们加起来,着实智障;
定义状态dp【i】【j】为序列A扫到i,序列B扫到B时候的公共子序列个数,状态转移方程如下:
其实这个状态转移方程也没那么好证明,但仔细想一想,如果相等的话,不过就是dp【i】【j-1】和dp【i-1】【j】的公共部分和a【i】和b【j】这一对组合,这公共部分在dp【i】【j-1】和dp【i-1】【j】中必定是重合的,然后就是还有a【i】和b【j】这一对组合单独着,然后状态转移方程就是上面第一个状态转移方程这样,然后第二个也是一样的考虑方式;(说实话把他放到简单dp里,我还是很羞愧的);
代码如下:
#include<iostream>
#include<sstream>
#include<iomanip>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<stack>
#include<list>
#include<map>
#include<set>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring> using namespace std; typedef long long ll;
typedef long double ld;
#define rep(a,b,c) for(int (a)=(b);(a)<=(c);(a)++)
#define drep(a,b,c) for(int (a)=(b);(a)=>(c);(a)--)
const int inf = 0x3f3f3f3f;
const double eps = 1e-;
const int mod = ; const int maxn = +;
ll dp[maxn][maxn];
int s[maxn],t[maxn]; int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==)
{
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++) scanf("%d",&s[i]);
for(int j=;j<=m;j++) scanf("%d",&t[j]);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(s[i]==t[j])
{
dp[i][j]=(dp[i-][j]+dp[i][j-]++mod)%mod;
}
else
{
dp[i][j]=(dp[i][j-]+dp[i-][j]-dp[i-][j-]+mod)%mod;
}
}
}
printf("%I64d\n",dp[n][m]);
}
return ;
}
hdu 5791 思维dp的更多相关文章
- HDU 5791 Two DP
Two Problem Description Alice gets two sequences A and B. A easy problem comes. How many pair of ...
- hdu 5791 (DP) Two
hdu 5791 Two Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- hdu 3709 数字dp(小思)
http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4283 区间dp
You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- HDU 2588 思维 容斥
求满足$1<=X<=N ,(X,N)>=M$的个数,其中$N, M (2<=N<=1000000000, 1<=M<=N)$. 首先,假定$(x, n)=m$ ...
随机推荐
- win10 + VS2015 编译 ARPACK
step 1: 下载ARPACK , mingw-w64-install 和 mingw-get-inst-20120426.exe: step 2: 安装 MinGW-64默认安装路径即可. ste ...
- ubuntu oracle数据库18c安装
一.官网下载linux两个zip包 二.byqKx8a2tWcgBHb
- MariaDB 更新查询
UPDATE 命令通过更改值来修改现有字段. 它使用SET子句指定要修改的列,并指定分配的新值. 这些值可以是字段的表达式或默认值. 设置默认值需要使用DEFAULT关键字. 该命令还可以使用WHER ...
- Service系统服务(四):搭建单区域DNS服务器、特殊DNS解析、配置DNS子域授权、搭建并测试缓存DNS
一.搭建单区域DNS服务器 目标: 本例要求要求为DNS区域tedu.cn搭建一台DNS服务器,以便用户能通过域名的方式访问网站.测试阶段主要提供以下正向记录: svr7.tedu.cn ---> ...
- Python每日一题 005
任一个英文的纯文本文件,统计其中的单词出现的个数. 代码 # coding:utf-8 import re def get_word(filename): fp=open(filename," ...
- 用define 宏定义注释符号
上面对define 的使用都很简单,再看看下面的例子:#define BSC //#define BMC /*#define EMC */D),BSC my single-line commentE) ...
- HTML5: HTML5 Web SQL 数据库
ylbtech-HTML5: HTML5 Web SQL 数据库 1.返回顶部 1. HTML5 Web SQL 数据库 Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个 ...
- 95、自然语言处理svd词向量
import numpy as np import matplotlib.pyplot as plt la = np.linalg words = ["I","like& ...
- 数据库(一)—— MySQL介绍
目录 MySQL介绍 一.MySQL版本 1.mysql主流版本 2.版本选择 二.MySQL连接与实例 1.MySQL的C/S结构 2.MySQL实例 三.mysql三层结构 1.连接层(连接上数据 ...
- log4j日志记录到文件
要写日志信息到一个文件中,必须使用org.apache.log4j.FileAppender.有以下FileAppender的配置参数: FileAppender配置: 属性 描述 immediate ...