SGU 201 Non Absorbing DFA (DP)
轉載請註明出處,謝謝http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
題意:給出一個自動機,給出所有的轉移,其中還有一個矩陣,如果(u,c)=0,直接轉移,字元c被接收,否則也會轉移但是字元c不會被轉移,也就是下一個字元依舊是字元c。
http://acm.sgu.ru/problem.php?contest=0&problem=201
題意理解了很久。。。。。
自動機都給出了狀態和轉移,顯然是個DP。。。
但是由於存在(u,c)=1的情況,即字元不變,所以需要預處理一下,得到最終接受字元的狀態
記憶化搜尋即可,可能出現死迴圈的情況,判定為不可轉移
需要高精度
import java.util.*;
import java.io.*;
import java.math.*;
public class Solution {
public static void main(String[] args) {
InputStream inputStream = System.in;
OutputStream outputStream = System.out;
InputReader in = new InputReader(inputStream);
PrintWriter out = new PrintWriter(outputStream);
Task solver = new Task();
solver.solve(in, out);
out.close();
}
}
class Task{
static int go[][]=new int [1005][26];
static boolean end[]=new boolean [1005];
static int x[][]=new int [1005][26];
static int to[][]=new int [1005][26];
int dfs(int now,int ch){
if(x[now][ch]==0){
return to[now][ch]=go[now][ch];
}
if(to[now][ch]!=-1)
return to[now][ch];
to[now][ch]=0;
return to[now][ch]=dfs(go[now][ch],ch);
}
void solve(InputReader in,PrintWriter out){
String S=in.next();
int m=S.length();
int n=in.nextInt();
int s=in.nextInt();
int endcnt=in.nextInt();
for(int i=1;i<=n;i++)
end[i]=false;
for(int i=0;i<endcnt;i++){
int u=in.nextInt();
end[u]=true;
}
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++)
go[i][j]=in.nextInt();
}
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
x[i][j]=in.nextInt();
to[i][j]=-1;
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
dfs(i,j);
}
}
int l=in.nextInt();
BigInteger dp[][]=new BigInteger [65][1005];
for(int i=0;i<=l;i++)
for(int j=1;j<=n;j++)
dp[i][j]=BigInteger.ZERO;
dp[0][s]=BigInteger.ONE;
for(int i=1;i<=l;i++){
for(int j=1;j<=n;j++){
for(int k=0;k<m;k++){
if(to[j][k]>0)
dp[i][to[j][k]]=dp[i][to[j][k]].add(dp[i-1][j]);
}
}
}
BigInteger ans=BigInteger.ZERO;
for(int i=1;i<=n;i++)
if(end[i])
ans=ans.add(dp[l][i]);
out.println(ans);
}
}
class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream));
tokenizer = null;
}
public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
}
相關文章
- SGU 495 Kids and Prizes:期望dp / 概率dp / 推公式公式
- SGU 202 The Towers of Hanoi Revisited (DP+遞迴)遞迴
- SGU 505
- SGU 120 SGU 228 Archipelago(計算幾何)Go
- SGU 532. Building Foundation 暴力UI
- dp 套 dp(dp of dp)小記
- SGU 110 Dungeon(立體幾何)
- DP套DP
- SGU 124 Broken line(計算幾何)
- SGU 277 Heroes(動態凸包維護)
- [DP] 數位DP
- 201-Bitwise AND of Numbers Range
- JAVA使用DFA演算法過濾敏感詞Java演算法
- dp套dp 隨寫
- 過濾或者查詢敏感詞(DFA 演算法)演算法
- DFA演算法之內容敏感詞過濾演算法
- (201)Atomic*實現原理
- Python 201:多程式教程Python
- Optimization with Function-Based Indexes (201)FunctionIndex
- 【DP】區間DP入門
- 自己實現一個 DFA 串模式識別器(一)模式
- 自己實現一個 DFA 串模式識別器(二)模式
- DFA在C#中的實現:過濾敏感詞C#
- [DP] DP最佳化總結
- returned a non-zero code: 139
- How to partition a non-partitioned table
- Rowids in Non-Oracle DatabasesOracleDatabase
- bzoj 3864: Hero meet devil [dp套dp]dev
- 序列 DP
- DP(一)
- dp板子
- SigmaStar SSD201規格書AST
- WWDC 201 What's new in cocoa touch
- HCNR201隔離放大設計
- DP動態規劃-爬塔(雙層dp)動態規劃
- Git提交遇到non-fast-forwardGitASTForward
- 單例項的duplicate(non ASM)單例ASM
- condition expression returns non-BooleanExpressBoolean