hdu 4057 AC自己主动机+状态压缩dp
2016-01-19 21:27
471 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4057
Problem Description
Dr. X is a biologist, who likes rabbits very much and can do everything for them. 2012 is coming, and Dr. X wants to take some rabbits to Noah's Ark, or there are no rabbits any more.
A rabbit's genes can be expressed as a string whose length is l (1 ≤ l ≤ 100) containing only 'A', 'G', 'T', 'C'. There is no doubt that Dr. X had a in-depth research on the rabbits' genes. He found that if a rabbit gene contained a particular gene segment,
we could consider it as a good rabbit, or sometimes a bad rabbit. And we use a value W to measure this index.
We can make a example, if a rabbit has gene segment "ATG", its W would plus 4; and if has gene segment "TGC", its W plus -3. So if a rabbit's gene string is "ATGC", its W is 1 due to ATGC contains both "ATG"(+4) and "TGC"(-3). And if another rabbit's gene string
is "ATGATG", its W is 4 due to one gene segment can be calculate only once.
Because there are enough rabbits on Earth before 2012, so we can assume we can get any genes with different structure. Now Dr. X want to find a rabbit whose gene has highest W value. There are so many different genes with length l, and Dr. X is not good at
programming, can you help him to figure out the W value of the best rabbit.
Input
There are multiple test cases. For each case the first line is two integers n (1 ≤ n ≤ 10),l (1 ≤ l ≤ 100), indicating the number of the particular gene segment and the length of rabbits' genes.
The next n lines each line contains a string DNAi and an integer wi (|wi| ≤ 100), indicating this gene segment and the value it can contribute to a rabbit's W.
Output
For each test case, output an integer indicating the W value of the best rabbit. If we found this value is negative, you should output "No Rabbit after 2012!".
Sample Input
Sample Output
Problem Description
Dr. X is a biologist, who likes rabbits very much and can do everything for them. 2012 is coming, and Dr. X wants to take some rabbits to Noah's Ark, or there are no rabbits any more.
A rabbit's genes can be expressed as a string whose length is l (1 ≤ l ≤ 100) containing only 'A', 'G', 'T', 'C'. There is no doubt that Dr. X had a in-depth research on the rabbits' genes. He found that if a rabbit gene contained a particular gene segment,
we could consider it as a good rabbit, or sometimes a bad rabbit. And we use a value W to measure this index.
We can make a example, if a rabbit has gene segment "ATG", its W would plus 4; and if has gene segment "TGC", its W plus -3. So if a rabbit's gene string is "ATGC", its W is 1 due to ATGC contains both "ATG"(+4) and "TGC"(-3). And if another rabbit's gene string
is "ATGATG", its W is 4 due to one gene segment can be calculate only once.
Because there are enough rabbits on Earth before 2012, so we can assume we can get any genes with different structure. Now Dr. X want to find a rabbit whose gene has highest W value. There are so many different genes with length l, and Dr. X is not good at
programming, can you help him to figure out the W value of the best rabbit.
Input
There are multiple test cases. For each case the first line is two integers n (1 ≤ n ≤ 10),l (1 ≤ l ≤ 100), indicating the number of the particular gene segment and the length of rabbits' genes.
The next n lines each line contains a string DNAi and an integer wi (|wi| ≤ 100), indicating this gene segment and the value it can contribute to a rabbit's W.
Output
For each test case, output an integer indicating the W value of the best rabbit. If we found this value is negative, you should output "No Rabbit after 2012!".
Sample Input
2 4 ATG 4 TGC -3 1 6 TGC 4 4 1 A -1 T -2 G -3 C -4
Sample Output
4 4 No Rabbit after 2012! Hint case 1:we can find a rabbit whose gene string is ATGG(4), or ATGA(4) etc. case 2:we can find a rabbit whose gene string is TGCTGC(4), or TGCCCC(4) etc. case 3:any gene string whose length is 1 has a negative W.
/** hdu 4057 AC自己主动机+状态压缩dp 题目大意:给定一些字符串(ATGC组成)。相同用该四个字符组成一个长度为l的字符串,若该字符串包括给定串的一个作为子串,那么就要 加上这个给定串的值,问最后该字符串的最大值为多少 解题思路:建立自己主动机,然后在上面跑,假设不要求每一个串的权值仅仅能获取一次,那么直接跑来跑去的即可,可是由于仅仅能取一次,串非常少, 能够状态压缩DP,dp[i][j][k]记录前i个字符走到j状态而且已经获得的串状态为k时的最优解。滚动数组优化空间 */ #include <stdio.h> #include <string.h> #include <algorithm> #include <vector> #include <queue> #include <iostream> using namespace std; const int inf=1e9+7; const int maxn=1005; int dp[2][maxn][1<<10]; int n,m,val[15]; struct Trie { int next[maxn][4],fail[maxn],_end[maxn]; int root,L; int change(char ch) { if(ch=='A')return 0; else if(ch=='T')return 1; else if(ch=='G')return 2; return 3; } int newnode() { for(int i=0; i<4; i++) { next[L][i]=-1; } _end[L++]=0; return L-1; } void init() { L=0; root=newnode(); } void Insert(char *buf,int id) { int len=strlen(buf); int now=root; for(int i=0; i<len; i++) { int q=change(buf[i]); if(next[now][q]==-1) next[now][q]=newnode(); now=next[now][q]; } _end[now]|=(1<<id); } void build() { queue<int>Q; fail[root]=root; for(int i=0; i<4; i++) { if(next[root][i]==-1) next[root][i]=root; else { fail[next[root][i]]=root; Q.push(next[root][i]); } } while(!Q.empty()) { int now=Q.front(); Q.pop(); _end[now]|=_end[fail[now]]; for(int i=0; i<4; i++) { if(next[now][i]==-1) { next[now][i]=next[fail[now]][i]; } else { fail[next[now][i]]=next[fail[now]][i]; Q.push(next[now][i]); } } } } int get(int s) { int ans=0; for(int i=0; i<n; i++) { if(s&(1<<i)) ans+=val[i]; } return ans; } void solve() { memset(dp,0,sizeof(dp)); dp[0][0][0]=1; for(int i=1; i<=m; i++) { memset(dp[i&1],0,sizeof(dp[i&1])); for(int j=0; j<L; j++) { for(int k=0; k<4; k++) { int x=next[j][k]; for(int r=0; r<(1<<n); r++) { if(dp[(i+1)&1][j][r]) { dp[i&1][x][r|_end[x]]=1; } } } } } int ans=-inf; for(int j=0; j<(1<<n); j++) { for(int i=0; i<L; i++) { if(dp[m&1][i][j]) { ans=max(ans,get(j)); } } } if(ans<0)puts("No Rabbit after 2012!"); else printf("%d\n",ans); } } t; char s[1005]; int main() { while(~scanf("%d%d",&n,&m)) { t.init(); for(int i=0; i<n; i++) { int x; scanf("%s%d",s,&val[i]); t.Insert(s,i); } t.build(); t.solve(); } return 0; }
相关文章推荐
- mysql的性能优化总结
- Java学习第6天:面向对象(1)简介对象
- spark 1.6 MLlib
- 帆软连接默认数据库的参数
- HTML
- 2016 系统设计第一期 (档案一)MVC form数据提交
- git、github for window、tortoisegit的区别
- asp.net中配置文件的详解
- android TV - Creating a Catalog Browser,Providing a Card View
- service总结
- Material Design整合使用之TabLayout+ViewPager
- 用户登录验证
- [iOS问题归总]iPhone上传项目遇到的问题
- paper 5:支持向量机系列二: Support Vector —— 介绍支持向量机目标函数的 dual 优化推导,并得出“支持向量”的概念。
- Live555 Streaming Media
- OCUI界面设计:UIPickerView 拾取视图
- 获取和设置asp:RadioButtonList的值
- python更改或者查看当前工作目录
- Reveal的使用
- APNS 那些事!