HDU4057 Rescue the Rabbit(AC 로봇 + Shape DP)
HDU2825와 대동소이하다.
1 #include<cstdio>
2 #include<cstring>
3 #include<queue>
4 using namespace std;
5 #define INF (1<<30)
6 int tn,ch[1111][4],fail[1111],flag[1111];
7 int idx[128];
8 void insert(char *s,int k){
9 int x=0;
10 for(int i=0; s[i]; ++i){
11 int y=idx[s[i]];
12 if(ch[x][y]==0) ch[x][y]=++tn;
13 x=ch[x][y];
14 }
15 flag[x]|=1<<k;
16 }
17 void init(){
18 memset(fail,0,sizeof(fail));
19 queue<int> que;
20 for(int i=0; i<4; ++i){
21 if(ch[0][i]) que.push(ch[0][i]);
22 }
23 while(!que.empty()){
24 int x=que.front(); que.pop();
25 for(int i=0; i<4; ++i){
26 if(ch[x][i]) que.push(ch[x][i]),fail[ch[x][i]]=ch[fail[x]][i],flag[ch[x][i]]|=flag[ch[fail[x]][i]];
27 else ch[x][i]=ch[fail[x]][i];
28 }
29 }
30 }
31 int d[2][1111][1<<10],VAL[1<<10];
32 int main(){
33 idx['A']=0; idx['G']=1; idx['T']=2; idx['C']=3;
34 int m,n,a;
35 char str[111];
36 int val[11];
37 while(~scanf("%d%d",&m,&n)){
38 tn=0;
39 memset(ch,0,sizeof(ch));
40 memset(flag,0,sizeof(flag));
41 for(int i=0; i<m; ++i){
42 scanf("%s%d",str,val+i);
43 if(strlen(str)>100) continue;
44 insert(str,i);
45 }
46 for(int i=1; i<(1<<m); ++i){
47 for(int j=0; j<m; ++j){
48 if((i>>j)&1) VAL[i]=VAL[i^(1<<j)]+val[j];
49 }
50 }
51 init();
52 for(int j=0; j<=tn; ++j){
53 for(int k=0; k<(1<<m); ++k) d[0][j][k]=-INF;
54 }
55 d[0][0][0]=0;
56 for(int i=0; i<n; ++i){
57 int x=i&1;
58 for(int j=0; j<=tn; ++j){
59 for(int k=0; k<(1<<m); ++k) d[x^1][j][k]=-INF;
60 }
61 for(int j=0; j<=tn; ++j){
62 for(int k=0; k<(1<<m); ++k){
63 if(d[x][j][k]==-INF) continue;
64 for(int y=0; y<4; ++y){
65 d[x^1][ch[j][y]][k|flag[ch[j][y]]]=max(d[x^1][ch[j][y]][k|flag[ch[j][y]]],d[x][j][k]+VAL[k^(k|flag[ch[j][y]])]);
66 }
67 }
68 }
69 }
70 int res=-INF;
71 for(int i=0; i<=tn; ++i){
72 for(int j=0; j<(1<<m); ++j) res=max(res,d[n&1][i][j]);
73 }
74 if(res<0) puts("No Rabbit after 2012!");
75 else printf("%d
",res);
76 }
77 return 0;
78 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.