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 201 Non Absorbing DFA (DP)的更多相关文章
- 201. Non Absorbing DFA
题意好难看懂的说... 有限状态自动机DFA是这么一个有序组<Σ, U, s, T, phi>:Σ代表输入字符集,表示此自动机的工作范围:U代表所有的状态集合:s是初始状态:T是最终状态: ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
随机推荐
- GoF——状态模式
状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. “状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况.把状态的判断逻辑转移到表示不同状态的一系列类 ...
- 从源码看Android中sqlite是怎么通过cursorwindow读DB的
更多内容在这里查看 https://ahangchen.gitbooks.io/windy-afternoon/content/ 执行query 执行SQLiteDatabase类中query系列函数 ...
- 供应类型与计划分类一致性检查(INV)
应用 Oracle Inventory 层 Level Function 函数名 Funcgtion Name CUXINVIMM 表单名 Form Name CUXINVIMM 说明 Descrip ...
- libcurl编译
下载: git://github.com/bagder/curl.git openssl: openssl编译 for linux or mingw:./buildconf./configure ...
- Oracle_系统和对象权限管理
授予系统权限: GRANT { system_privilege | role } [,{ system_privilege | role }]... ... TO {user | role | PU ...
- c++ 关于类构造函数的初始化列表
除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义的时候初始化,并且不能重 ...
- [置顶] block一点也不神秘————如何利用block进行回调
我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...
- 程序猿的量化交易之路(20)--Cointrader之Assert实体(8)
转载需说明出处:http://blog.csdn.net/minimicall, http://cloudtrade.top 不论什么可交易的都能够称之为Assert,资产.其类代码例如以下: pac ...
- SICP 习题 (1.10)解题总结
SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”. 就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就 ...
- HDU 4937 Lucky Number 规律题_(:зゝ∠)_
把全部合法的进制打出来会发现合法的进制都是在 n/3 n/4 n/5的边上 然后暴力边上的进制数.. #include <cstdio> #include <set> type ...