hdu 4899 Hero meet devil
传送阵:http://acm.hdu.edu.cn/showproblem.php?pid=4899
题目大意:给定一个DNA序列,求有多少长度为m的序列与该序列的最长公共子序列长度为0,1...|S|;
分析:
我们可以考虑对于求两个串的最长公共子序列的dp:f[i,j]代表第一个串到了i,第二个串到了j的最长公共子序列。对于两个串来说,如果数组f[i]是完全一样的,则它们对后面的影响也是完全一样的,所以我们可以设2维状态:F[i,j]代表我们当前以及到了i,f[i]的状态为j的方案数,但是这样设状态第二维有10^10。我们发现一个f[i,j]一定不会比f[i,j-1]小,且最多比f[i,j-1]多1,所以我们在设状态的时候可以取个差值,就变成2^10了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 20
#define mod 1000000007
char dic[]="ACTG";
int add[<<][];
int dp[][<<];
int pre[maxn],lcs[maxn],ans[maxn];
char s[maxn];
int T,n,m;
void Add(int &x,int y){
x+=y;
if(x>=mod)x-=mod;
}
void init(){
scanf("%s",s+);n=strlen(s+);
memset(add,,sizeof(add));
memset(dp,,sizeof(dp));
for(int state=;state<(<<n);++state){
pre[]=;
for(int i=;i<=n;++i)pre[i]=pre[i-]+((state>>(i-))&);
for(int k=;k<;++k){
for(int i=;i<=n;++i)
if(s[i]==dic[k])lcs[i]=pre[i-]+;
else lcs[i]=max(lcs[i-],pre[i]);
int &t=add[state][k];
for(int i=;i<=n;++i)
t|=((lcs[i]!=lcs[i-])<<(i-));
}
}
}
int get(int x){
int s=;
while(x){
s+=x&;
x>>=;
}return s;
}
void work(){
scanf("%d",&m);
int *now=dp[],*next=dp[];
memset(next,,(<<n)*sizeof(int));
next[]=;
for(int i=;i<=m;++i){
swap(now,next);
memset(next,,(<<n)*sizeof(int));
for(int state=;state<(<<n);++state)
if(now[state])
for(int k=;k<;++k)
Add(next[add[state][k]],now[state]);
}
memset(ans,,sizeof(ans));
for(int i=;i<(<<n);++i)
Add(ans[get(i)],next[i]);
for(int i=;i<=n;++i)
printf("%d\n",ans[i]);
}
int main(){
scanf("%d",&T);
while(T--){
init();
work();
}
return ;
}
hdu 4899 Hero meet devil的更多相关文章
- HDU 4899 Hero meet devil(状压DP)(2014 Multi-University Training Contest 4)
Problem Description There is an old country and the king fell in love with a devil. The devil always ...
- HDU 4899 Hero meet devil (状压DP, DP预处理)
题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...
- DP套DP HDOJ 4899 Hero meet devil(国王的子民的DNA)
题目链接 题意: 给n长度的S串,对于0<=i<=|S|,有多少个长度为m的T串,使得LCS(S,T) = i. 思路: 理解的不是很透彻,先占个坑. #include <bits/ ...
- bzoj 3864: Hero meet devil [dp套dp]
3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...
- 【BZOJ3864】Hero meet devil DP套DP
[BZOJ3864]Hero meet devil Description There is an old country and the king fell in love with a devil ...
- BZOJ3864 & HDU4899:Hero meet devil——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3864 http://acm.hdu.edu.cn/showproblem.php?pid=4899 ...
- bzoj3864: Hero meet devil
Description There is an old country and the king fell in love with a devil. The devil always asks th ...
- BZOJ3864: Hero meet devil(dp套dp)
Time Limit: 8 Sec Memory Limit: 128 MBSubmit: 397 Solved: 206[Submit][Status][Discuss] Description ...
- BZOJ3864: Hero meet devil【dp of dp】
Description There is an old country and the king fell in love with a devil. The devil always asks th ...
随机推荐
- Linux文件(区域)锁函数 -- open()、fcntl()
一.什么是文件锁定 对于锁这个字,大家一定不会陌生,因为我们生活中就存在着大量的锁,它们各个方面发挥着它的作用,现在世界中的锁的功能都可归结为一句话,就是阻止某些人做某些事,例如,门锁就是阻止除了屋主 ...
- Windows 7安装解压版MySQL 5.6(不包含配置文件优化)
到官网下载MySQL5.6 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html, 提供了 .exe版本 和 .zip解压版,因为我的操作系统是64位的 ...
- MongoDB系列一:CentOS7.2下安装mongoDB3.2.8
最近在又在倒腾MongoDB,把安装配置的相关命令贴出来 1.下载 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70- ...
- opencv二值化处理
#include "stdafx.h"//对一张图片进行二值化处理 IplImage *pSrclmg =NULL;//载入的图片IplImage *pDeclmg =NULL;/ ...
- java高cup占用解决方案
项目中发现java cpu占用高达百分之四百,查看代码发现有一个线程在空转,拉高了cup while(true){ } 解决方案,循环中加入延迟:Thread.sleep(Time): 总结下排查CP ...
- jquery-创建弹出框原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PHP PDO的FETCH_NUM、FETCH_BOTH、FETCH_ASSOC
不容易混淆的有:FETCH_CLASS,FETCH_COLUMN,FETCH_OBJ... 数据库的连接准备部分 $dsn = 'mysql:host=127.0.0.1;port=3306;dbna ...
- node04-buffer
目录:node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http node08-exp ...
- DOM动画效果的基础入门2
一.动画效果 Transform字面上就是变形,改变的意思,在css3中transform主要包括以下几种: 选转 rotate,扭曲 skew 缩放 scale 和移动translate 以及矩形变 ...
- BOM and Event Source
EventSource: var test = function(){ var btn = event.srcElement; var str += btn.type + ":" ...